Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Název souboru podle data a času v BAT a CMD příkazové řádce
leden 07
Název souboru podle data a času v BAT a CMD příkazové řádce

Rovnou dneska ještě jedna libůstka nad to spouštění PowerShellu přes BAT (viz. tady a tady). Někdy byste chtěli v batch souboru vygenerovat unikátní jméno souboru pro logy, nebo nějaké dočasné soubory. Ideálně se použije datum a čas, případně náhodné číslo. Takto

Datum a čas do proměnné v příkazové řádce

Všude se uvádí, že se dá použít dynamické proměnné %DATE% a %TIME% ale jejich formát závisí na regionálním nastavení (locale). Takže to není moc spolehlivé, jak jsem si vždycky myslel a dneska kvůli tomu musel plno věcí předělávat. Dá se použít například starší metoda přes WMI a jeho příkazová utilita WMIC s tabulkou (třída, class) Win32_LocalTime. Akorát je to dost zdlouhavé psaní. Na druhé straně to nevyžaduje PowerShell.

FOR /F "skip=2 tokens=2-7 delims=," %%i IN ('WMIC Path Win32_LocalTime GET Year^,Month^,Day^,Hour^,Minute^,Second /Format:CSV') DO (

  REM The leading zeros pad the numbers from the left
  SET day=0%%i
  SET hour=0%%j
  SET minute=0%%k
  SET month=0%%l
  SET second=0%%m
  SET year=%%n
)

REM Using the special notation in order to take only the last two digits from the padded values
SET datetime=%year%-%month:~-2%-%day:~-2%T%hour:~-2%-%minute:~-2%-%second:~-2%

ECHO DateTime sortable from WMIC: %datetime%

Jenže dneska máte PowerShell nejspíš úplně všude. A stejně ten BAT/CMD používáte jenom na startování nějakého jiného, obsažnějšího PowerShell scriptu. Tak proč to rovnou nevyužít?

REM Must specify the "usebackq" switch in order to be able to use single-quotes inside the powershell command
REM ExecutionPolicy parameter is not necessary here, because the execution policy does not affect -Command argument
FOR /F "usebackq tokens=1 delims= " %%i IN (`powershell -Command "(get-date).ToString('s').Replace(':','-')"`) DO (SET datetime=%%i)
ECHO DateTime sortable PowerShell: %datetime%

Pokud byste chtěli náhodné číslo do proměnné, tak třeba takto:

FOR /F "usebackq tokens=1 delims= " %%i IN (`powershell -Command "'{0:X8}' -f (Get-Random -Maximum 4GB -Minimum 0)"`) DO (SET random=%%i)
ECHO Random number on 8 hex digits: %random%

A pokud byste chtěli rovnou unikátní dočasný soubor v TEMPu, tak třeba takto:

FOR /F "usebackq tokens=1 delims= " %%i IN (`powershell -Command "[IO.Path]::GetTempFileName()"`) DO (SET tempfile=%%i)
ECHO Unique TEMP file name: %tempfile%

 

Comments

Re: Název souboru podle data a času v BAT a CMD příkazové řádce

ondass on 7.1.2016 15:38

%random%

od veci, ale asi by som zvolil iny nazov pre premennu ako %random% tato premenna je sucastou commandShellu uz od Windows XP a generuje tusim integer16
btw. antispamova ochrana rulez ;-)
runco on 7.1.2016 22:53

bug ve win7/2008

/format:csv => Invalid XSL format (or) file name.

http://stackoverflow.com/questions/9673057/wmic-error-invalid-xsl-format-in-windows7

/format:"%WINDIR%\System32\wbem\en-us\csv"
VasekB on 19.1.2016 15:34

Add Comment

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments