Come ottenere la data in un file batch in un formato prevedibile?


17

In un file batch ho bisogno di estrarre un mese, giorno, anno dal comando date. Quindi ho usato quanto segue, che analizza essenzialmente il comando Date per estrarre le sue stringhe secondarie in una variabile:

set Day=%Date:~3,2%
set Mth=%Date:~0,2%
set Yr=%Date:~6,4%

Tutto questo è fantastico, ma se distribuisco questo file batch su una macchina con diverse impostazioni regionali / nazionali, fallisce perché mese, giorno e anno si trovano in posizioni diverse.

Come posso estrarre mese, giorno e anno indipendentemente dal formato della data?


1
Sei assolutamente limitato a Batch? Una cosa del genere è molto più semplice in VBScript / WSH e / o PowerShell ...
Adrien,

@Adrien, Sì limitato al batch: fa parte del passaggio post-build VS2008.
AngryHacker,

sostituendo% data% con% data: ~ 6,4% -% data: ~ 3,2% -% data: ~ 0,2% lavorato
MagTun

Risposte:


14

Fonte: http://ss64.com/nt/syntax-getdate.html

Metodo 2 (cmd singolo)

GetDate.cmd

@Echo off
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"=="" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set _dd=00%%G
      Set _hour=00%%H
      SET _minute=00%%I
)
:s_done

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%

:: Display the date/time in ISO 8601 format:
Set _isodate=%_yyyy%-%_mm%-%_dd% %_hour%:%_minute%
Echo %_isodate%
pause

inserisci qui la descrizione dell'immagine


Metodo 1 (cmd + vb)

GetDate.cmd

@Echo off
For /f %%G in ('cscript /nologo getdate.vbs') do set _dtm=%%G
Set _yyyy=%_dtm:~0,4%
Set _mm=%_dtm:~4,2%
Set _dd=%_dtm:~6,2%
Set _hh=%_dtm:~8,2%
Set _nn=%_dtm:~10,2%
Echo %_yyyy%-%_mm%-%_dd%T%_hh%:%_nn%

getdate.vbs

Dim dt
dt=now
'output format: yyyymmddHHnn
wscript.echo ((year(dt)*100 + month(dt))*100 + day(dt))*10000 + hour(dt)*100 + minute(dt)

1
Ah ah, un modo molto pulito per trovare l'ordinamento della data del locale. ss64 ha una bella comunità di utenti cmd.exe.
Nicholi,

Ho incluso entrambi gli script dal tuo link di origine. Spero sia ok per te
nixda

@nixda Nessun problema, qualunque cosa l'utente aiuti.
Tex Hex,

Se devi conservare i secondi nel "Metodo 2" sopra, aggiungi Set _second=00%%Kdurante l'estrazione da wmice pad con zeri iniziali come gli altri.
Tim Parenti,

12

Windows XP e versioni successive

getDate.cmd

@echo off
for /f "tokens=2 delims==" %%G in ('wmic os get localdatetime /value') do set datetime=%%G

set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%

echo %year%/%month%/%day%

Produzione

inserisci qui la descrizione dell'immagine


+1 per la risposta più concisa. Suggerirei anche di terminare con ECHO %year%-%month%-%day%quale sia il formato compatibile ISO e filesystem (per non parlare degli ordinamenti automatici per anno-mese-giorno). :-).
Zephan Schroeder,

3

So che non è esattamente quello che mi hai chiesto, ma utilizzo la porta Windows datedell'applicazione Linux da un comando all'interno del file batch e quindi assegno il risultato a una variabile.

Devo ancora trovare un modo per ottenere la data in modo affidabile utilizzando solo i comandi batch.


2

Utilizzare questo file batch per il formato AAAA-MM-GG. Utilizza lo strumento di strumentazione per finestre che dovrebbe essere presente in tutte le recenti versioni di Windows per ottenere una stringa datetime indipendente dalle impostazioni internazionali.

Salvare in un file batch nel percorso (ad es.) C: \ windows \ rdate.bat quindi accedere con un CATE RDATE.BAT per impostare le variabili. In alternativa, copia il codice nel tuo file batch.

Questo formato data è adatto per nomi di file e registrazione. Si ordina correttamente. La variabile logtime aggiunge una variabile data + ora come AAAA-MM-GG-HHMMSS adatta per l'uso nella registrazione dell'attività dei file batch con una precisione seconda.

Regola i formati di data (e ora) come desideri. REM l'eco dello schermo in produzione. I due numeri in ciascuna selezione di testo sono l'indice del carattere iniziale in base zero e il numero di caratteri da copiare, ad esempio% datetime: ~ 0,4% accetta una sottostringa di 4 caratteri che inizia nella posizione 0.

echo off
rem First, get the locality-invariant datetime
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
rem echo %datetime%

rem Build the reverse date string YYYY-MM-DD
set rdate=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2%
echo rdate=%rdate%

rem Built a datetime string YYYY-MM-DD-hhmmss
set logtime=%rdate%-%datetime:~8,6% 
echo logtime=%logtime%

1
Quasi uguale alla risposta di and31415 . Entrambi gli script usanowmic os get localdatetime
nixda il


0

Hai provato a utilizzare NET TIME \\%ComputerName%invece di DATE? Penso che NET TIMEdovrebbe fornire i dati in un formato coerente indipendentemente dalle impostazioni locali.


No, non lo è.
AngryHacker,

Interessante, l'ho appena provato, passando tra i formati AU e US e net timesempre in formato m / d / yyyy. @AngryHacker, con quali impostazioni non ha funzionato per te?
Hydaral,

1
Ho cambiato francese (belga) e mi ha dato il 27/07/2011. Gli Stati Uniti danno il 27/07/2011
AngryHacker il

0

Grazie al post di Shekhar, questo funziona secondo necessità e zero imbottiture del tempo.

@Echo Off

for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%%date:~4,2%%date:~7,2%-%%d%%e

set datetimestr=%var: =0%

set logfile=LogFile-%datetimestr%.txt

echo %logfile%

Uscita: LogFile-20151113-0901.txt


-1

Questo potrebbe essere un po 'fuori tema, ma qui c'è un file .bat che ho scritto per i miei backup pianificati e che richiamo anche dalle azioni postbuild in Visual Studio. Spero che alcuni lo troveranno utile.

Salvare quanto segue in un file .bat

--------------------------------------------------
**:: The following is Copyright © 2012 ShopNetNuke Corp.  All rights reserved.
::  and released under the GNU General Public License (GPLv3)**

:: The following section retrieves the current date and time and formats it into the '%var%' variable
:: This format always ensures that the Date and Time are fixed length to avoid the situation of
:: having a value of '12/ 1/2012 rather than '12/01/2012'
echo off
for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
set var=%var: =0%
echo Beginning my valuable Backup Set:  Backup--%var%

:: If you wanted to request the user input a filename prefix, 
:: then we would use something similar to this
:: set /p nameprefix= Enter the file name prefix?
:: Get the Current Date and Time
::for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
:: set var=%var: =0%
:: echo Beginning my valuable Backup Set:  Backup--%var%_%nameprefix%

Pause

echo Starting SQL Server Database Backup Job...
:: The following line initiates the Backup job within SqlServer Agent.
:: Change 'MyBackupNameInSqlAgent' to the name of the job you want executed
:: Change the directory paths to those relevant to your current system installation directories
:: SqlAgent will not return a value if the backup action succeed, 
:: however, in the event an error is encountered, it will be echoed onto the screen
"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe" -S SQLSERVERNAME\INSTANCENAME -Q "execute msdb.dbo.sp_start_job @job_name = 'MyBackupNameInSqlAgent'"
:: An error will be returned if the Backup job is not found or has already been triggered by another process

echo Starting My Valuable Source Code Directory Backup...

echo ...backing up files and folders in "C:\Source\MyPreciousProjectDirectory\"...
:: The following line will execute the 7zip command to create a .7z file of the directory named in 'MyPreciousProjectDirectory'
:: and tells it to put the archive in the 'MyPreciousBackupDirectory'.  The compression level will be defined by the 7zip default settings
:: The -p flag tells 7zip to password protect the archive, in this case, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectory\%var%\MyPreciousProject--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 

echo Source Code Directory Backups complete.

echo Archiving Database Backups now...
:: The following line will execute the 7zip command to archive the Database backup.
:: The '*' could be replaced by the actual backup name.
:: The '*' indicates all files of type '.bak'
:: The -p flag tells 7zip to password protect the archive, in this case, again, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z  C:\MyPreciousBackupDirectory\%var%\MyPreciousProject-Database-%var%.7z -p%var% -mhe "C:\Program Files\Microsoft SQL Server\MSSQL10.SQLDEV08\MSSQL\Backup\*.bak"

echo Database Backup Archival process complete.

:: If you wanted to place both the previous backups into one single combination archive,
:: you could do something like the following
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var%\MyPreciousProjectBackupSourceAndDatabase--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 


echo Now attempting to copy archives to Network Server...
:: The following line will use xcopy to copy the arechives to the server backup directory and place them in a directory named by the DateTime variable %var%
xcopy /S /I /J /Y C:\MyPreciousBackupDirectory\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%
:: Or if the combination above was used then copy that...
xcopy /S /I /J /Y C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%


echo 7z Archive files transferred to MyPreciousBackupServerName successfully
echo  ||
echo \||/
echo  \/
echo ---------------------------------------------------
echo ----- BACKUP SET "%var%" COMPLETE ------
echo ---------------------------------------------------
pause

1
tl; dr, potresti aggiungere una spiegazione di ciò che fa lo script. perché non viene subito come soluzione. Potrebbe anche essere più utile, se puoi rimuovere i bit di codice non pertinenti
Shekhar,

1
L'intero script batch si basa sulle variabili %date%e %time%, che sono a livello locale e non possono essere analizzate in modo prevedibile come richiesto dall'OP.
and31415,
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.