Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Пробел вместо нуля в разряде десятков часов

Ответить
Настройки темы
CMD/BAT - Пробел вместо нуля в разряде десятков часов

Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: qaaqasqad
Дата: 06-03-2017
Описание: оптимизация
При добавлении текущего времени к имени файла (или папки), при создании папки с текущим временем в имени и многих других случаях, где используется %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"
Системное время во всех местах отображается подходяще - с нулем...

Отправлено: 18:29, 02-03-2017

 
x0r x0r вне форума

Забанен


Сообщения: 795
Благодарности: 137

Профиль | Цитировать


Я себе дату беру для имени папки по другому. так удобней:
Код: Выделить весь код
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
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:15, 02-03-2017 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:26, 02-03-2017 | #3


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:04, 02-03-2017 | #4


Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


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 не заморачивался...

Последний раз редактировалось qaaqasqad, 05-03-2017 в 14:19. Причина: дополнение


Отправлено: 01:00, 03-03-2017 | #5

x0r x0r вне форума

Забанен


Сообщения: 795
Благодарности: 137

Профиль | Цитировать


Цитата qaaqasqad:
О %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
.. и будет тебе нуль
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:41, 03-03-2017 | #6


Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


x0r
Спасибо. "Обнулился" (в хорошем смысле). Наилучший вариант, т. к. (это я уже о %date% и о методе в целом) нормально вставляет дату при любых системных настройках ее краткого формата типа dd.MM.yyyy или d.M.yy (конечно, о сортировке по имени речь уже не будет идти, но все равно приятно). А от "зкзотических" разделителей компонентов даты и времени (моя вчерашняя загвоздка) спасет 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
Еще раз всем спасибо!

Последний раз редактировалось qaaqasqad, 05-03-2017 в 14:07.


Отправлено: 00:49, 04-03-2017 | #7


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


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"

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:30, 04-03-2017 | #8

x0r x0r вне форума

Забанен


Сообщения: 795
Благодарности: 137

Профиль | Цитировать


Цитата qaaqasqad:
с перебором, но на всякий случай »
ну пральна, чё. если делать универсально, то да. надо учитывать что в выводе даты-времени разделителем может быть что угодно и лучше перебрать все варианты.

Отправлено: 20:36, 04-03-2017 | #9


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


по моему, так:
Код: Выделить весь код
@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
как-то понятнее и без извращений с перебором ...
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:19, 05-03-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Пробел вместо нуля в разряде десятков часов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Снижение стоимости часов Pebble и возможное появление часов LG на webOS OSZone News Новости информационных технологий 0 02-10-2014 19:30
Разное - Некорректное завершение работы при разряде батареи P.O.D. Microsoft Windows 7 0 02-11-2010 10:26
На DVD диске объём превышает несколько десятков гигабайт gen0m.rsw Хочу все знать 4 11-07-2010 20:37
Выключение сервера при разряде UPS Seven Microsoft Windows NT/2000/2003 11 08-02-2010 11:44
В Windows и Office найдено более двух десятков «дыр» CnyH9I Флейм 4 05-02-2010 16:58




 
Переход