Потрібен провідний нуль для пакетного сценарію з використанням змінної% 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%
outputs:
09:18:53,45


1
це працює! це найпростіше рішення, я думаю ..
аеробрайн

Чи можна це зробити і з кількома символами? iE всі ',', '' і ':'. В даний час я створюю проміжні змінні, але, звичайно, це працює лише через невелику кількість замін. Бо більше це було б громіздко.
Деволус

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%рано в додатковому дзвінку - тоді просто працюйте з ним timestring(або будь-якою змінною, яку ви використовуєте).
bshea

14

Моє рішення було використовувати таку ідею:

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

Мені це подобається. Простий та інтуїтивний.
Кен

Працює в сучасних Windows, але дає синтаксичну помилку на сервері 2003!
Д-р БДО Адамс

Працює бездоганно на найелегантнішому рішенні 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

Для найбільш компактного рішення, що реалізує все вище, я думаю, що це

ДЛЯ / 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
Я не впевнений, що це працює. Якщо я запускаю "встановити T = 0% час%", і це 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 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
Хоча код цінується, він завжди повинен мати супровідне пояснення. Це не повинно бути довгим, але очікується.
Peterh каже відновити Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.