Riga di comando di Windows: crea un file con la data corrente nel suo nome


19

Sto cercando di creare un file zip da uno script batch. Ho bisogno che si chiami come archive_.zip

Sfortunatamente, questo non funziona su sistemi con la data formattata come y / m / d a causa delle barre:

zip some_options "archive_%DATE%.zip"

La %DATE%variabile si espande in qualcosa del genere

Mon 09/28/2009

Ho accesso al pacchetto gnuwin32, quindi potrei usare, diciamo, sedper sostituire spazi e barre con trattini. Il problema è, come dovrei usare l'output di sedper creare il nome del file dell'archivio zip?

In Unix (bash), si possono usare le virgolette per valutare un comando sul posto e usare il suo output in un altro comando, qualcosa come:

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

C'è qualcosa di simile disponibile in Windows?

O forse c'è un modo per impostare una variabile sul valore restituito di sede usarlo per costruire il nome del file?

Risposte:


27

Puoi sostituire i simboli nelle variabili usando:

set _date=%DATE:/=-%

1
Questo è un trucco pulito!
Cristi Diaconescu,

PS Esiste un modo "one-liner" per sbarazzarsi di spazi o altri personaggi cattivi? (invece di avere una terza ... ennesima variabile temporanea per ogni personaggio da sostituire)
Cristi Diaconescu,

No scusa. Sembra che non ci sia nulla di simile. È necessario eseguire il fallback alla sintassi for per farlo. NB: Questo è un bel riferimento per la programmazione batch: robvanderwoude.com/batchfiles.php
Christopher,

5
questo è anche più veloce di %date:~-10,2%-%date:~-7,2%-%date:~-4,4% :!
Jess Stone,

Come mai nessuno ha fatto +1 sulla tua risposta Jess Stone! +1 da me !!!
Arvo Bowen,

5

Uso sempre:

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

Quindi CDate sarà Sat02182012. Se vuoi renderlo più ordinabile, imposta CDate su %% d - %% b - %% c, quindi sarà 18-02-2012

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

Per rendere la cartella e il file di data e ora compatibili


4

Ho pubblicato una risposta a una domanda molto simile qui . La suddivisione della data nei campi viene eseguita su 1 riga, anziché su più righe nella risposta di harrymc.

La parte interessante è:

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

E l'avvertimento è ancora rilevante:

Attenzione : il formato della data (yyyymmdd = %% k %% j %% i) dipende dalle impostazioni internazionali. Poiché utilizzo il formato data francese (gg / mm / aaaa), devo utilizzare "%% k %% j %% i" come formato (%% i = giorno, %% j = mese, %% j = anno).

Se le impostazioni internazionali sono impostate sullo stile USA (mm / gg / aaaa), è necessario utilizzare "%% k %% i %% j" (%% i = mese, %% j = giorno, %% j = anno) .


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

la /=-sostituisce il /segno meno.


2

Questo bit piuttosto orribile di codice dovrebbe fare qualcosa di simile a quello che vuoi

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

Se si modifica il nome file in modo appropriato.


1
Ti interessa spiegare la mostruosità? :)
Cristi Diaconescu,

Fondamentalmente sta tagliando i bit fuori dalla data e inserendoli nel mezzo del nome del file, puoi testarlo facendo l'eco poi parti dell'orrore dalla riga di comando, quindi se fai l'eco% data: ~ 6,4% dà il anno. Sta solo sottostringendo la data e l'ora.
Col

Interessante. Purtroppo non troppo portatile ...
Cristi Diaconescu,

Sfortunatamente il problema con l'uso delle sottostringhe è che si basa su un determinato formato di data e esplode quando è diverso. echo %date:~6,4%%date:~3,2%%date:~0,2%ritorna 9-289-20sulla mia macchina poiché ho impostato la data per utilizzare yyyy-MM-gg (quindi oggi è 28/09/2009).
Giosuè,

È vero, utilizzo questa soluzione solo su una macchina, quindi non è un grosso problema.
Col

2

Dal momento che la tua domanda è etichettato come di Windows, ho trovato questa soluzione che funziona nei buoni vecchi file .bat:
"di Windows file batch (.bat) per ottenere la data corrente in formato MMGGAAAA" ,
e può probabilmente essere adattati al vostro caso:

echo on
@REM Lotto di data rapida di Seamonkey (formato MMDDYYYY)
@REM Setup% data variabile
@REM Prima analizza i formati di mese, giorno e anno nei formati mm, gg, aaaa e poi combina per essere MMDDYYYY

FOR / F “TOKENS = 1 * DELIMS =” %% A IN ('DATA / T') IMPOSTARE 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%') DO SET yyyy = %% Bv vSET date =% mm %% dd %% yyyy%

questo non fa altro che impostare la variabile% date in modo che sia la data odierna nel formato MMDDYYYY in modo che possa essere richiamata successivamente nello script.

Modifica
Trovato una sintassi migliore. Dato che la mia data è oggi "lun 28/09/2009":
set day =% Date: ~ 0,2%
set month =% Date: ~ 7,2%
set year =% Date: ~ 10,4%


2

pura versione cmd.exe in combinazione con gnuwin32-'date ':

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>

Quindi può fare sostituzioni sul posto! Se me lo chiedi, il comando 'for' ha una strana sintassi ...
Cristi Diaconescu,

non ho affermato che non poteva :) tutta la roba 'cmd' è pazza comunque, chiunque abbia progettato che fosse nel profondo di una sorta di brutto sogno. il cmd "for" in realtà crea delle righe (ovvero "srotola" il "loop") nel primo passaggio e quindi esegue lo script così "creato".
Akira,

1

che dire di usare cscript + vbasic:

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

chiamalo via

cscript /nologo zip_it.vbs

1

Per / f "token = 1,2,3,4,5 delims = /." %% a in ('data / T') imposta CDate = %% d - %% b - %% c

@echo data =% CDate%

Questo è l'anno-mese-giorno che è più comune oggi giorni


1

Qualsiasi soluzione che utilizza uno %DATE%o l'output di date /tprobabilmente si interromperà se l'utente ha modificato le proprie impostazioni internazionali. Ad esempio, ho impostato il formato "short date" su "yyyy-MM-dd", quindi ho %DATE%uguale a "2012-02-18"e date /tproduce lo stesso output. (Questo è per Windows 7; presumo che sia lo stesso per le versioni precedenti di Windows.)

Costruire un file batch e quindi eseguirlo.

Dato che hai il datecomando GNU disponibile, puoi fare qualcosa del genere:

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

tmp.bat conterrà qualcosa come:

zip some_options archive_2012-02-18.zip

Si noti che questo crea tmp.batnella directory corrente, che potrebbe essere un problema; potrebbe essere meglio creare %TEMP%\tmp.bat. Inoltre non ho rimosso il file in seguito; è abbastanza facile da fare.

date +FORMATconsente di specificare il formato di output del datecomando, simile a una printfstringa di formato; vedere la documentazione della data di coreutils per i dettagli. Il formato può includere testo arbitrario, quindi in questo caso non è nemmeno necessario utilizzarlo sed.


1

Immagino che se metti insieme i pezzi di tutti ottieni qualcosa che funzioni per te. Questo è su un sistema Windows 2003 per darmi un'istantanea dei processi in esecuzione in risposta a un trigger dal monitor delle prestazioni:

@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

Il file di output è denominato in una stringa senza delimitatori.


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

Dovrebbe funzionare.

D'altra parte, forse hai un datecomando disponibile (non conosco Windows). Se sì, allora basta:

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

Il trucco del backtick non funziona in cmd.exe. E il comando 'date' di Windows non può gestire la formattazione :(
Cristi Diaconescu,

-1

non sono sicuro che ti vada bene, ma il mio codice è

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt

L'OP vuole un file con la data corrente nel nome del file , non nel contenuto
Jan Doggen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.