Нужен ведущий ноль для пакетного скрипта, использующего переменную% time%


26

Я столкнулся с ошибкой в ​​моем сценарии DOS, которая использует данные даты и времени для именования файлов. Проблема заключалась в том, что у меня был пробел, потому что переменная времени не обеспечивала автоматически нулевой начальный угол в течение часа <10. Таким образом, запуск> 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 утра).

Этот вопрос связан с этим .

Благодарность


Можно получить значение добавленного часа ... FOR / F "TOKENS = 1 DELIMS =:" %% A IN ('TIME / T') DO SET HH = %% A, затем заменить% time: ~ 0,2% с% HH% я надеялся на более компактное решение, но это сработает.
Ира

«Более компактным» решением было бы что-то на другом языке (powershell? Python? Perl? WSH?).
grawity

Переключился, чтобы отметить ответ Джесси как решение, которое я использую. Он работает как до полудня, так и с 0, а также после полудня.
Ира

Ответы:


60

Очень простой способ - просто заменить начальный пробел на ноль:
echo %TIME: =0%
output:
09:18:53,45


1
оно работает! это самое простое решение, я думаю ..
aerobrain

Можно ли это сделать несколькими персонажами? То есть все ',', '' и ':'. В настоящее время я создаю промежуточные переменные, но, конечно, это работает только из-за небольшого числа замен. Для большего было бы обременительно.
Деволус

1
Я использую это во втором "шаге", чтобы изменить Часы: set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME%также см. Ss64.com/nt/syntax-replace.html
обрабатывать

+1 Это самый короткий / лучший ответ. Как я использовал: в set timestring=%TIME: =0%начале вызова sub - затем просто поработайте с ним timestring(или с любой переменной, которую вы используете).
bshea

14

Моим решением было использовать следующую идею:

SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%

Мне это нравится. Просто и интуитивно понятно.
Кен

Работает на современных окнах, но выдает синтаксическую ошибку на сервере 2003!
Доктор BDO Адамс

Работает безупречно на 2008+, самое элегантное решение. Спасибо.
Bjoster

1
but gives syntax error on server 2003- почему тебя это волнует в 2016 году?
Марцин Орловский

Идеально подходит для командной строки Windows 10
Майк Апджон,

5

Идея похожа на ответ Дениса . Проблема в том, что ширина %time%всегда одна и та же, поэтому она вставляет пробел в начало, а не возвращает более короткую строку.

Вы можете избавиться от этого с помощью for:

for /f "delims= " %x in ("%time%") do set T=0%x

Остальное более или менее то же самое.


2
Это решение работает для> 10, но теперь создает '010' для 10: ...
Devolus

3
Правильный ответ от Джесси ...
Саймон Собиш

Это очень плохой ответ, он ломается, как только в часе появляются две цифры. Я не могу поверить, что ОП выбрала его.
thebunnyrules

3

Используя вклад Джесси, я только что создал переменную с измененным выводом. Затем я ссылаюсь на эту переменную, чтобы построить часовую часть.

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

Спасибо Джесси. Я бы проголосовал, если бы у меня были очки репутации.


1

Для наиболее компактного решения, реализующего все вышеперечисленное, я думаю, что

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

будет работать здесь без добавления каких-либо новых строк в сценарий. Это, возможно, менее элегантно, чем решения с несколькими командами, хотя ..


1

Следующее занимает еще несколько строк, но ясно и понятно. Он сохраняет 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%

0

Это привязывает ноль к началу времени и принимает последние две цифры часа (минутная и вторая стартовые позиции смещены на одну). Таким образом, 3 часа утра становится «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

1
Я не уверен, что это работает. Если я запускаю 'set T = 0% time%' и сейчас 9:38, эхо% T% возвращает: '0 9: 38: 54.21', тогда взятие% T: ~ 1,2% получает пробел, без лидера 0.
Ира

0

Одна строка кода будет делать то, что вам нужно:

    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%

0

Это создает сортируемую временную метку, а вторая строка обеспечивает отсутствие пробелов для однозначного часа и т. Д., Чтобы сделать ее пригодной для использования в сценариях:

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


0

Благодаря помощи сверху ... Вот что я использую:

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 это файл, созданный в конце, и он сортируется по имени файла.


0

Ответ Джесси решил мою проблему с переименованием файлов, исключив пробел в поле часа. Вот как я устанавливаю свои переменные:

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

Это работает как чемпион; По какой-то причине дата не нуждалась в таком же лечении, но я думаю, что это зависит от региональных условий.


0
    @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

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

5
Хотя код ценится, у него всегда должно быть сопутствующее объяснение. Это не должно быть долго, но ожидается.
Петер говорит восстановить Монику
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.