Показать полную графическую версию : Пробел вместо нуля в разряде десятков часов
qaaqasqad
02-03-2017, 18:29
При добавлении текущего времени к имени файла (или папки), при создании папки с текущим временем в имени и многих других случаях, где используется %time:~0,2% , имеем пробел вместо нуля в разряде десятков часов, если часы не перевалили за 10: Err-123- 8.06.53.log и FOLDER- 8.07.49 вместо желаемых Err-123-08.06.53.log и FOLDER-08.07.49 , что неудобно (в т.ч. при сортировке по имени). Это исправимо? Знатоки! Откликнитесь!
for %%i in (Err-*.log) do ren "%%i" "%%~ni-%time:~0,2%.%time:~3,2%.%time:~6,2%%%~xi"
md "FOLDER-%time:~0,2%.%time:~3,2%.%time:~6,2%"
Подробности: ось - WinXP SP3 Pro, в реестре:
[HKEY_CURRENT_USER\Control Panel\International]
"iTLZero"="1"
"sTimeFormat"="HH:mm:ss"
Системное время во всех местах отображается подходяще - с нулем...
Я себе дату беру для имени папки по другому. так удобней:
rem взять дату заменить точки на подчеркивание, развернуть сначала год_месяц_день
for /f "delims=. tokens=1,2,3" %%i in ("%date%") do set d=%%k_%%j_%%i
rem echo %d%
подчеркивания можно заменить на '-' или др.
... тоже самое и с временем, чуть изменив:
rem взять время заменить точки на подчеркивание.
for /f "delims=:, tokens=1,2,3" %%i in ("%time%") do set t=%%i_%%j_%%k
echo %t%
pause
megaloman
02-03-2017, 20:26
qaaqasqad, вот Ваш код без пробела Set "time1=%time: =0%"
Set "time1=%time1:~0,2%.%time1:~3,2%.%time1:~6,2%"
for %%i in (Err-*.log) do ren "%%i" "%%~ni-%time1%%%~xi"
md "FOLDER-%time1%"
greg zakharov
02-03-2017, 22:04
@echo off
setlocal enabledelayedexpansion
call:getsafetime "."
echo:%time%
endlocal
exit /b
:getsafetime
set "time=%time:~0,-3%" % rem : отбросить миллисекунды
set "time=%time: =%" % rem : удалить пробелы
if /i "%~1" neq "" (
set "time=!time::=%~1!"
) else (set "time=%time::=%")
exit /b
qaaqasqad
03-03-2017, 01:00
greg zakharov
Спасибо. Постараюсь осилить (см. P.S.)
x0r
Спасибо. С %date% все прошло гладко. О %time% : ну не заработал у меня этот и еще пара-тройка подобных ему сценариев, пока вручную не поставил точки в качестве разделителей компонентов системного времени (а это меня не устраивает). А когда извлеченное из системы время все же вставилось куда нужно, то при HH<10 вместо нуля в разряде десятков часов обнаружился все тот же пробел... И все равно было очень познавательно. Еще раз спасибо.
megaloman
Спасибо. Очень компактно и эффективно. Все заработало как положено, и нужные нули - в нужных местах без мороки (да Вы и сами знаете). Добавил (по аналогии) вставку даты, разумный твик реестра (чтобы без сюрпризов), подобрал компактные разделители (дело вкуса). И вот что вышло:
Reg.exe add "HKCU\Control Panel\International" /v "s1159" /t REG_SZ /d "" /f
Reg.exe add "HKCU\Control Panel\International" /v "s2359" /t REG_SZ /d "" /f
Reg.exe add "HKCU\Control Panel\International" /v "sDate" /t REG_SZ /d "." /f
Reg.exe add "HKCU\Control Panel\International" /v "sTime" /t REG_SZ /d ":" /f
Reg.exe add "HKCU\Control Panel\International" /v "sShortDate" /t REG_SZ /d "yyyy.MM.dd" /f
Reg.exe add "HKCU\Control Panel\International" /v "iTLZero" /t REG_SZ /d "1" /f
Reg.exe add "HKCU\Control Panel\International" /v "sTimeFormat" /t REG_SZ /d "HH:mm:ss" /f
Set "date1=%date: =0%"
Set "date1=%date1:~0,4%'%date1:~5,2%'%date1:~8,2%"
Set "time1=%time: =0%"
Set "time1=%time1:~0,2%'%time1:~3,2%'%time1:~6,2%"
for %%i in (Err-*.log) do ren "%%i" "%%~ni_%date1%`%time1%%%~xi"
md "FOLDER_%date1%`%time1%"
(последние две строки - как примеры использования)
А вот и желаемый продукт: Err-123_2017'03'02`06'12'19.log и FOLDER_2017'03'02`06'12'19 !
Всем большое спасибо!
P.S. До этого на тему CMD/BAT не заморачивался...
О %time% : »
Сделай еще одну оп-цию с переменной:
rem взять время заменить точки на подчеркивание.
for /f "delims=:, tokens=1,2,3" %%i in ("%time%") do (set t=%%i_%%j_%%k)
set t=%t: =0%
echo %t%
pause
.. и будет тебе нуль :)
qaaqasqad
04-03-2017, 00:49
x0r
Спасибо. "Обнулился" :) (в хорошем смысле). Наилучший вариант, т. к. (это я уже о %date% и о методе в целом) нормально вставляет дату при любых системных настройках ее краткого формата типа dd.MM.yyyy или d.M.yy (конечно, о сортировке по имени речь уже не будет идти, но все равно приятно). А от "зкзотических" разделителей компонентов даты и времени (моя вчерашняя загвоздка) :biggrin: спасет delims=.:,;-_`/|\ (с перебором, но на всякий случай). В итоге пришел к такому:
::Reg.exe add "HKCU\Control Panel\International" /v "sShortDate" /t REG_SZ /d "yyyy.MM.dd" /f
for /f "delims=.:,;-_`/|\ tokens=1,2,3" %%i in ("%date%") do (set dateX=%%i'%%j'%%k)
for /f "delims=.:,;-_`/|\ tokens=1,2,3" %%i in ("%time%") do (set timeX=%%i'%%j'%%k)
set timeX=%timeX: =0%
md "FLDR`%dateX%`%timeX%"(При необходимости - раскомментировать первую строку; последняя строка - для примера).
На выходе (при yyyy/MM/dd в системе) получается: FLDR`2017'03'04`06'55'56 :up
Еще раз всем спасибо!
megaloman
04-03-2017, 17:30
qaaqasqad, А что если так:FOR /F "tokens=1,2,3,4,5,6 delims=.:,;-_`/|\" %%i IN ("%date%-%time: =0%") DO Set "Dtime=%%i'%%j'%%k`%%l'%%m'%%n"
Echo %Dtime%
или эдак:FOR /F "tokens=1,2,3,4,5,6 delims=.:,;-_`/|\" %%i IN ("%date%-%time: =0%") DO md "FLDR`%%i'%%j'%%k`%%l'%%m'%%n"
с перебором, но на всякий случай »
ну пральна, чё. если делать универсально, то да. надо учитывать что в выводе даты-времени разделителем может быть что угодно и лучше перебрать все варианты.
по моему, так:
@echo off
set "sdate=%date:~6%'%date:~3,2%'%date:~0,2%"
set "ntime=%time:~0,8%"
set "stime=%ntime::='%"
md "FLDR`%sdate: =0%`%stime: =0%"
pause
как-то понятнее и без извращений с перебором ...
qaaqasqad
05-03-2017, 13:57
alpap
Это дает результат, пригодный для сортировки по имени (типа FLDR`2017'03'04`04'06'17 ), только при системном формате даты dd.MM.yyyy . Попробуйте это же запустить при yyyy.MM.dd или при d/M/yy ...
megaloman
Ваши методы отлично копируют системные последовательности компонентов датывремени при любых разумных разделителях, однако результат типа FLDR`2017'03'04`04'06'17 получается только при yyyy/MM/dd (хоть и с любыми разделителями).
qaaqasqad (сам себе)
Или результат типа FLDR`2017'03'04`04'06'17 не гарантирован, или твик реестра "sShortDate"="yyyy.MM.dd" так и останется в системе...
А что, если так (и результат абсолютно не зависит от системного формата датывремени, и сам этот формат в итоге возвращается в систему):
reg copy "HKCU\Control Panel\International" "HKCU\0" /s /f | reg add "HKCU\Control Panel\International" /v "sShortDate" /t REG_SZ /d "yyyy.MM.dd" /f
for /f "tokens=1,2,3,4,5,6 delims=.:,;-_`/|\" %%i in ("%date%-%time: =0%") do set "datetime=%%i'%%j'%%k`%%l'%%m'%%n"
reg copy "HKCU\0" "HKCU\Control Panel\International" /s /f | reg delete "HKCU\0" /f
md "FLDR`%datetime%"
Есть идеи, как без сильного разрастания кода и без ущерба функциональности вернуть delims к неизвращенному состоянию (и есть ли в этом смысл)?
вернуть delims к неизвращенному состоянию (и есть ли в этом смысл)? »
никакого изврата нету. этот перебор, это пол такта проца ;-) Ежлиб были в консоли регулярки, былоб \W и все. но т.к. их нету, то набор символов и это норм.
и есть ли в этом смысл »
при yyyy.MM.dd или при d/M/yy ... »
если уж хотите точно быть уверены чтобы поставить в нужном порядке при любом формате и разделителе, то:
@echo off
for /f "tokens=1* delims==" %%a in ('"wmic path win32_localtime get Day,Month,Year,Hour,Minute,Second /value|find "^=""') do set "%%a=0%%b"
md "FLDR`%Year:~-5%'%Month:~-3%'%Day:~-3%`%Hour:~-3%'%Minute:~-3%'%Second:~-3%"
pause
этот же class и в PS, там еще проще и короче.
qaaqasqad
07-03-2017, 14:48
alpap
Спасибо! Идеально! Не к чему придраться! Лучше и быть не может! :laiel:
alpap
А можно ли подобным образом добавить к имени файла дату-время его создания (изменения), т.е., например,
file.ext -> file`1988'09'24`21'55'51.ext ?
dassen,
для такого случая достаточно:
@echo off
call :# "file.txt"
pause& exit
:#
set "mt=%~t1"
ren "%~1" "%~n1-%mt::='%%~x1"
exit /b
megaloman
14-04-2018, 16:42
@Echo Off
Call :WRen "E:\Основная папка\тра ля ля.exe"
GoTo :Eof
:WRen
SetLocal
If Not Exist %1 Exit /B 2
Set "Fin=%~1"
Set "Fin=%Fin:\=\\%"
For /f "tokens=1* delims=," %%a in ('wmic datafile where "name='%Fin%'" get 'Creation Date' /format:csv') Do (
If /I "%%a"=="%ComputerName%" Set "Df=%%b"
)
Ren %1 "%~n1`%Df:~0,4%'%Df:~4,2%'%Df:~6,2%`%Df:~8,2%'%Df:~10,2%'%Df:~12,2%%~x1" ||Exit /B 1
EndLocal
Exit /B 0Вместо Creation Date можно запросить Last Modified
DJ Mogarych
14-04-2018, 18:34
Тоже столкнулся с таким поведением командной строки, когда хотел, чтобы логи robocopy назывались по датам.
В результате самым простым методом стало просто перевести всё в Powershell.
$t = get-date -UFormat "%Y-%m-%d_%H-%M-%S"
ROBOCOPY C:\temp D:\Temp /MIR /TEE /NP /LOG:log_$t.txt
megaloman, спасибо.
А если нужно добавить дату-время изменения к имени файла file.ext , лежащего в одной папке с этим батником?
( Call :WRen "file.ext" не прокатывает... )
megaloman
26-08-2018, 20:05
dassen, Call :WRen "%~dp0file.ext"Если надо не дата-время создания, а изменения, то заменить
'Creation Date' на 'Last Modified'
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.