Windows-Befehlszeile: Erstellen Sie eine Datei mit dem aktuellen Datum im Namen

19

Ich versuche, eine Zip-Datei aus einem Batch-Skript zu erstellen. Ich muss den Namen archive_.zip haben

Leider funktioniert dies aufgrund der Schrägstriche nicht auf Systemen, deren Datum wie y / m / d formatiert ist:

zip some_options "archive_%DATE%.zip"

Die %DATE%Variable erweitert sich zu so etwas wie

Mon 09/28/2009

Ich habe Zugriff auf das Paket gnuwin32, sodass ich beispielsweise sedLeerzeichen und Schrägstriche durch Bindestriche ersetzen kann. Das Problem ist, wie würde ich die Ausgabe von verwenden sed, um den Dateinamen des Zip-Archivs zu erstellen?

In Unix (bash) kann man einen Befehl in Anführungszeichen setzen, um ihn vor Ort auszuwerten und seine Ausgabe in einem anderen Befehl zu verwenden.

zip [...] archive_`echo %DATE% | sed -e s/.../.../`.zip

Gibt es etwas Ähnliches in Windows?

Oder gibt es eine Möglichkeit, eine Variable auf den zurückgegebenen Wert von zu setzen sedund diesen zum Erstellen des Dateinamens zu verwenden?

Cristi Diaconescu
quelle

Antworten:

27

Sie können Symbole in Variablen ersetzen, indem Sie Folgendes verwenden:

set _date=%DATE:/=-%
Christopher
quelle
1
Das ist ein toller Trick!
Cristi Diaconescu
PS Gibt es eine Einzeiler-Methode, mit der Sie auch Leerzeichen oder andere unangenehme Zeichen entfernen können? (im Gegensatz zu einer 3. ... n. temporären Variablen für jedes zu ersetzende Zeichen)
Cristi Diaconescu
Nein Entschuldigung. Es scheint so etwas nicht zu geben. Sie müssen auf die for-Syntax zurückgreifen, um dies zu tun. NB: Dies ist eine nette Referenz für die Batch-Programmierung: robvanderwoude.com/batchfiles.php
Christopher
5
das ist noch schneller als %date:~-10,2%-%date:~-7,2%-%date:~-4,4% :!
Jess Stone
Wie hat niemand deine Antwort +1 Jess Stone! +1 von mir !!!
Arvo Bowen
5

Ich benutze immer:

For /f "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDate=%%a%%b%%c%%d

Dann wird CDate Sat02182012 sein. Wenn Sie es sortierbarer machen möchten, setzen Sie CDate auf %% d - %% b - %% c, damit es 2012-02-18 sein wird

For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g

So machen Sie Datum und Uhrzeit für Ordner / Dateien benutzerfreundlich.

släcker
quelle
4

Ich habe eine Antwort auf eine sehr ähnliche Frage gestellt hier . Das Aufteilen des Datums in Felder erfolgt in einer Zeile anstelle mehrerer Zeilen in Harrymcs Antwort.

Der interessante Teil ist:

@echo off
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
echo Date: %yyyymmdd%

Und die Warnung ist immer noch relevant:

Warnung : Das Format des Datums (JJJJMTT = %% k %% j %% i) hängt von Ihren regionalen Einstellungen ab. Da ich das französische Datumsformat (TT / MM / JJJJ) verwende, muss ich "%% k %% j %% i" als Format verwenden (%% i = Tag, %% j = Monat, %% j =) Jahr).

Wenn Ihre regionalen Einstellungen auf US-Stil eingestellt sind (MM / TT / JJJJ), sollten Sie "%% k %% i %% j" (%% i = Monat, %% j = Tag, %% j = Jahr) verwenden. .

Snark
quelle
3
zip some_options "archive_%date:/=-%.zip"

das /=-ersetzt das /mit einem Minuszeichen.

Theo
quelle
2

Dieser ziemlich schreckliche Code sollte so etwas wie das tun, was Sie wollen

move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"

Wenn Sie den Dateinamen entsprechend ändern.

Col
quelle
1
Möchtest du die Monstrosität erklären? :)
Cristi Diaconescu
Es schneidet im Grunde genommen Bits aus dem Datum heraus und füttert sie in die Mitte des Dateinamens. Sie können es testen, indem Sie Echo und dann Teile des Grauens in der Befehlszeile ausführen Jahr. Es ist nur ein Teil der Zeit und des Datums.
Col
Interessant. Leider nicht allzu tragbar ...
Cristi Diaconescu
Leider besteht das Problem bei der Verwendung von Teilzeichenfolgen darin, dass sie auf ein bestimmtes Datumsformat angewiesen sind und bei Abweichungen explodieren. echo %date:~6,4%%date:~3,2%%date:~0,2%kehrt 9-289-20auf meinem Computer zurück, da ich das Datum für die Verwendung von JJJJ-MM-TT festgelegt habe (heute ist also der 28.09.2009).
Joshua
Es stimmt, ich verwende diese Lösung nur auf einer Maschine, es ist also kein zu großes Problem.
Col
2

Da Ihre Frage als Windows - markiert ist, fand ich diese Lösung , dass die Arbeiten in den guten alten .bat - Dateien:
„Windows Batch - Datei (.bat) aktuelles Datum in MMTTJJJJ Format zu bekommen“ ,
und können wahrscheinlich auf Ihren Fall angepasst werden:

echo on
@REM Seamonkeys schneller Datumsstapel (MMDDYYYY)
@REM Richtet die% Datumsvariable @REM ein.
Parst zuerst Monat, Tag und Jahr in die Formate MM, TT, JJJJ und kombiniert diese dann zu MMDDYYYY

FOR / F “TOKENS = 1 * DELIMS =” %% A IN ('DATE / T') SETZE CDATE = %% B
FOR / F “TOKENS = 1,2 eol = / DELIMS = /” %% A IN ( 'DATE / T') DO SET mm = %% B
FOR / F “TOKENS = 1,2 DELIMS = / eol = /” %% A IN ('echo% CDATE%') DO SET dd = %% B
FOR / F “TOKENS = 2,3 DELIMS = /” %% A IN ('echo% CDATE%') SETZE JJJJ = %% Bv vSET date =% mm %% tt %% JJJJ%

Dies ist nichts anderes, als die Variable% date so einzurichten, dass sie das heutige Datum im Format MMDDYYYY enthält, damit sie später im Skript aufgerufen werden kann.

Bearbeiten
Eine bessere Syntax gefunden. Da mein Datum heute "Mo 28/09/2009" ist:
festgelegter Tag =% Datum: ~ 0,2%
festgelegter Monat =% Datum: ~ 7,2%
festgelegter Jahr =% Datum: ~ 10,4%

Harrymc
quelle
2

reine cmd.exe Version in Kombination mit dem gnuwin32-'date ':

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>
Akira
quelle
Es können also direkte Substitutionen durchgeführt werden! Wenn Sie mich fragen, hat der Befehl 'for' eine seltsame Syntax ...
Cristi Diaconescu
Ich habe nicht behauptet, es könnte nicht sein :) Das ganze 'cmd'-Zeug ist sowieso verrückt, wer auch immer das entworfen hat, war tief in eine Art bösen Traum verstrickt. Der Befehl 'for' erstellt im ersten Durchgang tatsächlich Linien (alias 'entrollt' die 'Schleife') und führt dann das so 'erstellte' Skript aus.
Akira
1

was ist mit cscript + vbasic:

WScript.shell.run "zip archive_" & DatePart("yyyy", Now) & "_" & DatePart("m", Now) & "_" & DatePart("d", Now) & ".zip " & WScript.arguments(0)

Ruf es an über

cscript /nologo zip_it.vbs
Akira
quelle
1

Für / f "tokens = 1,2,3,4,5 delims = /." %% a in ('date / T') setze CDate = %% d - %% b - %% c

@echo data =% CDate%

Dies ist der Jahr-Monat-Tag, der heutzutage am häufigsten vorkommt


quelle
1

Jede Lösung, die eine der beiden %DATE%oder die Ausgabe von verwendet date /t, kann zum Absturz führen, wenn der Benutzer seine regionalen Einstellungen geändert hat. Zum Beispiel habe ich mein "kurzes Datum" -Format auf eingestellt "yyyy-MM-dd", damit ich %DATE%gleich habe "2012-02-18"und date /tdie gleiche Ausgabe erzeuge. (Dies gilt für Windows 7; ich gehe davon aus, dass dies auch für frühere Versionen von Windows gilt.)

Erstellen Sie eine Batchdatei und führen Sie sie aus.

Da Sie den GNU- dateBefehl zur Verfügung haben, können Sie so etwas tun:

C:\path\to\gnu\date "+zip some_options archive_%Y-%m-%d.zip" > tmp.bat
call .\tmp.bat

tmp.bat wird etwas enthalten wie:

zip some_options archive_2012-02-18.zip

Beachten Sie, dass dies tmp.batim aktuellen Verzeichnis zu Problemen führt. es könnte besser sein zu schaffen %TEMP%\tmp.bat. Ich habe die Datei danach auch nicht entfernt; das ist einfach genug.

date +FORMATMit dieser Option können Sie das Ausgabeformat des dateBefehls angeben , ähnlich einer printfFormatzeichenfolge. Einzelheiten finden Sie in der Dokumentation zu coreutils date . Das Format kann beliebigen Text enthalten, sodass Sie in diesem Fall nicht einmal verwenden müssen sed.

Keith Thompson
quelle
1

Ich denke, wenn Sie alle Teile zusammenfügen, erhalten Sie etwas, das für Sie funktioniert. Dies ist auf einem Windows 2003-System, um mir einen Schnappschuss der ausgeführten Prozesse als Reaktion auf einen Auslöser des Systemmonitors zu geben:

@echo off
For /f "tokens=1,2,3,4,5 delims=/. " %%i in ('date /t') do set CDate=%%k%%j%%i
For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g
tasklist /fo table >tasklist%CDate%%CTime%.txt

Die Ausgabedatei wird in einer Zeichenfolge ohne Begrenzer benannt.

Anton Liebscher
quelle
0
zip [...] archive_`echo %DATE% | tr / -`.zip

Sollte arbeiten.

Andererseits - vielleicht haben Sie einen dateBefehl zur Verfügung (ich kenne Windows nicht). Wenn ja, dann machen Sie einfach:

zip [...] archive_`date +'%Y-%m-%d'`.zip

quelle
Der Backtick-Trick funktioniert in cmd.exe nicht. Und der Windows-Befehl 'date' kann die Formatierung nicht verarbeiten :(
Cristi Diaconescu
-1

Ich bin mir nicht sicher, ob es zu dir passt, aber mein Code ist

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
Kelly
quelle
Das OP möchte eine Datei mit dem aktuellen Datum im Dateinamen , nicht im Dateiinhalt
Jan Doggen