Я обнаружил ошибку в моем сценарии DOS, который использует данные даты и времени для именования файлов. Проблема заключалась в том, что у меня возник пробел, потому что переменная времени не предоставляла автоматически начальный ноль для часа <10. Итак, running> echo% time% возвращает: '9: 29: 17.88'.
Кто-нибудь знает способ условно дополнить начальные нули, чтобы исправить это?
Дополнительная информация: Моя команда установки имени файла:
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
который в итоге оказывается: C: \ Temp \ robolog_20100602_ 93208.log (на 9:23 утра).
Этот вопрос связан с вот этот.
Спасибо
Очень простой способ - просто заменить ведущий пробел на ноль:
echo %TIME: =0%
выходы:
09:18:53,45
Мое решение заключалось в использовании следующей идеи:
SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%
Подобная идея Ответ Денниса. Проблема в том, что ширина %time%
всегда одно и то же, поэтому он вставляет пробел в начало вместо того, чтобы возвращать более короткую строку.
Вы можете избавиться от этого с помощью for
:
for /f "delims= " %x in ("%time%") do set T=0%x
В остальном то же самое.
Используя вклад Джесси, я просто создал переменную с измененным выводом. Затем я ссылаюсь на эту переменную, чтобы построить часовую часть.
set NantTime=%time: =0%
nant\bin\nant.exe -nologo+ -debug+ -verbose+ -D:project.config=debug /f:build\default.build -l:logs\architect-build-%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%-%NantTime:~0,2%-%time:~3,2%-%time:~6,2%.log
pause
С первоисточником:
set hour=%time: =0%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%hour:~0,2%%time:~3,2%%time:~6,2%.log
Спасибо, Джесси. Я бы проголосовал, если бы имел очки репутации.
Для наиболее компактного решения, реализующего все вышеперечисленное, я думаю, что
FOR / F "TOKENS = 1-4 DELIMS = /" %% A IN ("% DATE%") DO FOR / F "TOKENS = 1-3 DELIMS = :." %% E IN ("% TIME: = 0%") DO SET logfile = C: \ Temp \ robolog _ %% D %% C %% B _ %% E %% F %% G.log
будет работать здесь без добавления каких-либо новых строк в сценарий. Возможно, это менее элегантно, чем несколько командных решений.
Следующее занимает еще несколько строк, но ясно и понятно. Он сохраняет stdout и stderr в отдельные файлы, каждый с отметкой времени. Отметка времени включает год, месяц, день, час, минуту и секунду в указанном порядке. Отметки времени всегда должны содержать наиболее значимый компонент даты первым (год) и наименьший компонент (секунды) - последним. Это позволяет размещать списки файлов во времени. Без лишних слов, вот мое решение.
:prepare time stamp
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set hour=%time:~0,2%
:replace leading space with 0 for hours < 10
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set minute=%time:~3,2%
set second=%time:~6,2%
set timeStamp=%year%.%month%.%day%_%hour%.%minute%.%second%
:run the program
ProgramName.pl 1> RunLogs\out.%timeStamp% ^
2> RunLogs\err.%timeStamp%
Это прибавляет ноль к началу времени и берет последние две цифры часа (минуты и вторая начальные позиции сдвигаются на единицу). Таким образом, 3:00 становится «03», затем «03», а час 15 становится «015», затем «15».
set T=0%time%
set T=%T:~1,2%%T:~4,2%%T:~7,2%
set D=%date:~-4%%date:~4,2%%date:~7,2%
set logfile=C:\Temp\robolog_%D%_%T%.log
Менее читабельно:
set T=0%time%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%T:~1,2%%T:~4,2%%T:~7,2%.log
Одна строка кода сделает то, что вам нужно:
IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
Например, я использую% Date%, а затем добавляю начальный ноль к переменной, которую использую, чтобы определить, нужно ли мне заменить начальный пробел нулем для% Time%.
::Prepare TimeStamp variable by replacing leading space with 0 for Hours < 10
SET TimeStamp=%Time:~0,8%
IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
Echo Started on %Date$ at %TimeStamp%
:: Insert what you are doing here...
SET TimeStamp=%Time:~0,8%
IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
ECHO Finished on %Date% at %TimeStamp%
Это создает сортируемую метку времени, а вторая строка проверяет, нет ли пробелов для однозначного часа и т.д., чтобы ее можно было использовать для сценариев:
set datestamp=%date:~-4%.%date:~-10,-8%.%date:~-7,-5%_%time:~0,2%.%time:~3,2%.%time:~6,2%
set datestamp=%datestamp: =_%
Вывод:
2018.02.26__9.47.34
Благодаря помощи свыше ... Вот что я использую:
C:\Windows\System32>SET short=%date:~10,4%-%date:~4,2%-%date:~7,2%
C:\Windows\System32>ECHO -- Short Date: %short%
-- Short Date: 2018-06-27
C:\Windows\System32>SET long=%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
C:\Windows\System32>ECHO -- Long Date: %long%
-- Long Date: 2018-06-27_10_51_43
Затем у меня есть журналы, которые вызываются в заданиях Robocopy следующим образом:
Таких много:
Robocopy C:\Users\ME\Favorites\ %usb%:\Local_PC\Favorites\ /MIR /TEE /FFT /DST /TIMFIX /W:5 /R:5 /NP /LOG+:%usb%:\Robocopy\LOG_%short%.txt
Завершает работу этим:
REN %usb%:\Robocopy\LOG_%short%.txt COMPLETE_LOG_%long%.log
COMPLETE_LOG_2018-06-27_10_53_54.log
это файл, созданный в конце, и его можно отсортировать по имени файла.
Ответ Джесси решил мою проблему с переименованием файлов, убрав пробел в поле часа. Вот как я устанавливаю свои переменные:
for /f "tokens=1,2,3,4 delims=/ " %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%d
for /f "tokens=1,2 delims=:" %%a in ("%time: =0%") do set hour=%%a&set minute=%%b
Это работает как чемпион; по какой-то причине дата не нуждалась в таком же обращении, но я полагаю, что это зависит от региональных настроек.
@echo off
call :PAD aaa,2,0,grw
echo [[aaa=%aaa%]]
pause
rem #### Function PAD ####
goto :PADEND
:PAD <var>,<length>,<padchar>,<string>
set padtot=%~2
set padchar=%~3
set padString=%~4
:StartPADLOOP
call :len lenpadString,%padString%
if ["%lenpadString%"] GEQ ["%padtot%"] goto :EndPADLOOP
set padString=%padchar%%padString%
goto :StartPADLOOP
:EndPADLOOP
set %~1=%padString%
GOTO :EOF
:PADEND
rem #### Function LEN ####
goto :LENEND
:LEN <var>,<string>
set LENtempvar=%~2
rem echo {{S:%LENtempvar%}}
set LENCOUNT=0
:startLENLOOP
if ["%LENtempvar%"] EQU [""] goto :endLENLOOP
rem echo {{A:%LENtempvar%}}
set LENtempvar=%LENtempvar:~0,-1%
rem echo {{B:%LENtempvar%}}
set /a LENCOUNT=LENCOUNT+1
goto :startLENLOOP
:endLENLOOP
set %~1=%LENCOUNT%
GOTO :EOF
:LENEND
set sFolderName=%time: =0%
xcopy "%UserProfile%\Pictures\*.jpg" Y:\"%DATE%-%sFolderName:~0,2%h%time:~3,2%m%time:~6,2%s-%random%" /I /C /Y
15.06.2015-03h43m34s-5357
5357-%random%"