| 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%
|