понедельник, сентября 12, 2011

timestamp in filename

2012 год на дворе, а в windows до сих пор сложно получить строку вида yyyy-MM-dd-hh-mm в командных файлах без программирования. В основном все вырезают кусочками нужные части из %date% (для года %date:~6,4%) и %time%. Все это сразу перестает работать в другой локали. Потом приходится думать что делать с отсутствующими leading zero в месяцах-днях-часах-минутах. Я для себя остановился на следующей версии


set "exec=wmic path win32_LocalTime get Year^,Month^,Day^,Hour^,Minute /value"
for /f "tokens=1,2 delims==" %%i in ('%exec%') do 2>nul set "%%i=%%j"
set month=0%month%
set month=%month:~-2%
set day=0%day%
set day=%day:~-2%
set hour=0%hour%
set hour=%hour:~-2%
set minute=0%minute%
set minute=%minute:~-2%

Через wmic получаем нужные строчки, парсим, где надо добавляем нули.

Ну не мытьём, так катанием.

В итоге скрипт по сохранению базы древнего MS SQL 2000, со структурой хранения
\SQLBackup\yyyy-MM\yyyy-MM-dd\SQLDB-yyyy-MM-dd-hh-mm.bak
относительно местоположения скрипта может выглядеть так


REM __________________ Edit area _______________________
set folder=SQLBackup
set filename=SQLDB
REM _________________________________________________
set cmdpath=%~dp0
set "exec=wmic path win32_LocalTime get Year^,Month^,Day^,Hour^,Minute /value"
for /f "tokens=1,2 delims==" %%i in ('%exec%') do 2>nul set "%%i=%%j"
set month=0%month%
set month=%month:~-2%
set day=0%day%
set day=%day:~-2%
set hour=0%hour%
set hour=%hour:~-2%
set minute=0%minute%
set minute=%minute:~-2%
set yyyy_mm=%year%-%month%
set yyyy_mm_dd=%year%-%month%-%day%
set yyyy_mm_dd_hh_mm=%year%-%month%-%day%-%hour%-%minute%

mkdir "%cmdpath%%folder%\%yyyy_mm%\%yyyy_mm_dd%"
osql -E -Q "BACKUP DATABASE CorpDB TO DISK = '%cmdpath%%folder%\%yyyy_mm%\%yyyy_mm_dd%\%filename%-%yyyy_mm_dd_hh_mm%.bak';" -o "%cmdpath%%folder%\%yyyy_mm%\%yyyy_mm_dd%\%filename%-%yyyy_mm_dd_hh_mm%.log"

Комментариев нет:

Мой список блогов