Identifizieren Sie das Muster für den Dateinamen mithilfe eines Stapels

1

Ich habe ein Skript, das Dateien umbenennt, indem dem aktuellen Dateinamen ein Zeitstempel als Präfix hinzugefügt wird. Eine Datei mit einem Zeitstempel sieht folgendermaßen aus:

20170407_1030.file1.txt

Ich führe dieses Skript in einem Ordner aus, nachdem ich mit einigen Dateien gearbeitet habe. Das Problem ist, dass eine Datei, der bereits ein Zeitstempel vorangestellt wurde, beim nächsten Ausführen des Skripts dem Dateinamen einen weiteren Zeitstempel voranstellt. Wenn der Name einer Datei bereits einen Zeitstempel enthält, möchte ich ihn durch einen aktualisierten Zeitstempel ersetzen .

Um dies zu erreichen, versuche ich, Dateinamen zu identifizieren, die bereits einen Zeitstempel enthalten, und diesen gegebenenfalls durch einen aktualisierten Zeitstempel zu ersetzen.

Mein Skript dazu sieht derzeit so aus:

setlocal enabledelayedexpansion

for /f "delims=|" %%F in ('dir /b %cd%\*.*') do (
  set "MDate=%%~tF"
  set "Patern=*_*."
  set "TimeStamp=!MDate:~6,4!!MDate:~0,2!!MDate:~3,2!"
  ren "%%~nF%%~xF" "!TimeStamp!-%%~nF%%~xF" 
)
exit

Bearbeiten: Entschuldigung, dass Sie keine weiteren Details angegeben haben. Ich habe einige Nachforschungen angestellt und kann keine Möglichkeit finden, die Masken in der angegebenen Stichprobe abzugleichen. Ich weiß, wie man vordefinierte Muster ersetzt oder wie man Masken wie passt ren *.png *.jpg.

Brneor
quelle
2
Vielen Dank, dass Sie uns mitteilen, was Sie tun möchten. Hast du eine Frage? Und wenn Ihre Frage wie ist, zeigen Sie uns bitte, was Sie zuerst versucht haben! :) Es wird helfen, damit wir keine Antworten geben, die Sie bereits versucht haben. Wenn Sie nichts versucht haben, seien Sie bereit für Abstimmungen! Das Grundprotokoll kann jedoch die Anzahl der Perioden sein. Wenn nicht, ist Ihre Frage nicht klar, da Sie nicht genügend Details angeben. Egal, bis Sie Ihre Frage bearbeitet haben, habe ich für das Schließen gestimmt. Entschuldigung
Dave
1
Außerdem ist SuperUser keine Site der Art "Bitte schreibe mir ein Skript". Teilen Sie Ihre Recherchen mit und wir helfen Ihnen dabei, herauszufinden, warum die Dinge nicht so funktionieren, wie sie funktionieren.
LPChip
Weitere Infos hinzugefügt.
Brneor
Ihre "Frage" ist auch nach der Bearbeitung noch schlammklar. Ich weiß nicht, wie ich
Dbenham
Entschuldigung, bitte sehen Sie nach, ob es jetzt klar genug ist :)
brneor

Antworten:

2
@Echo off
Pushd "X:\path\to\workdir"

:: Get current date time 
For /f "delims=." %%A in (
  'wmic os get LocalDateTime^|findstr ^^[0-9]'
) do Set DT=%%A
Set "DT=%DT:~0,8%_%DT:~8,4%"

For /f "tokens=1* delims=." %%A in (
  'Dir /B/A-D "20*_*.*.txt"^|findstr "^20[0-9][0-9][01][0-9][0-3][0-9]_[0-2][0-9][0-5][0-9]\." '
) do Echo ren "%%A.%%B" "%DT%.%%B"

Wenn die Ausgabe in Ordnung aussieht, entfernen Sie das Echo in der letzten Zeile.

Beispielausgabe:

> SU_1225592.cmd
ren "20170704_1656.File1.txt" "20170704_1700.File1.txt"
ren "20170704_1656.File2.txt" "20170704_1700.File2.txt"

Bearbeiten Um eine Datei nur auf das Vorhandensein eines date_time-Musters zu prüfen, können
Sie diesen Stapel verwenden, der nur die von findstr zurückgegebene Fehlerstufe verwendet
, um einen Erfolg bedingt auszuführen &&oder ||andere Befehle nicht auszuführen.

@Echo off
Set "Pattern=^20[0-9][0-9][01][0-9][0-3][0-9]_[0-2][0-9][0-5][0-9]\."
For %%A in ("%CD%\*") Do Echo:%%~nA|findstr "%Pattern%">NUL 2>&1 && (
    Echo found Pattern in %%~fA
) || (
    Echo No    Pattern in %%~fA
)

Beispielausgabe:

No    Pattern in A:\Copy+Archive.cmd
No    Pattern in A:\SU_1225592.cmd
found Pattern in A:\20170704_1656.File1.txt
found Pattern in A:\20170704_1656.File2.txt
No    Pattern in A:\tp010387.BAT
LotPings
quelle
Obwohl dies nicht die Antwort ist, nach der ich gesucht habe, führte es mich direkt zur Lösung. Vielen Dank.
Brneor