3 / 3 / 0
Регистрация: 14.10.2012
Сообщений: 18

Переименование файла с датой и временем в имени с учетом GMT

10.11.2012, 13:00. Показов 12670. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Имеются файлы с одной системы ***********_ГГГГММДД_ЧЧММ и имеются файлы второй системы ***********_(01) ***********_(02) ***********_(03) и т. д. Для наглядности и удобного отслеживания событий (файлы смешиваются) необходимо файлы с последнего переименовать в формат первого ***********_ГГГГММДД_ЧЧММ, где будет добавлена дата создания, первые 11 символов остаются неизменными, а (01) (02) (03) соответственно отрезаются. Использую для этого сценарий

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
chcp 1251
:: Чтобы правильно отразилась дата в названии файла он не должен быть скопирован из оригинальной локализации (только перемещен или обработан прямо из нее - при копировании меняются даты создания файла)
set "folder=%USERPROFILE%\Избранное"
set "mask=*.*"
 
for /f "delims=" %%n in ('dir /b "%folder%\%mask%"') do (
    for /f "tokens=1-7 delims=:-/. " %%a in ('dir /tc "%folder%\%%n" ^|find " %%n"') do (
        setlocal enabledelayedexpansion
        call :RND 10 50 u
        Set US=%%n
        ren "%folder%\%%n" "!US:~0,11!_%%c%%b%%a_%%d%%e!u!%%~xn"
    )
)
endlocal
pause
:: Секунды в сценарии вроде как отобразить невозможно, используем генератор случайных чисел для вставки секунд чтобы не было совпадения файлов
:RND
set MIN=%1
set MAX=%2
SET /A %3=%MIN%+(%MAX%-%MIN%+1)*%random%/32768
но он собака ставит дату на 5 часов меньше реальной, которая есть на самом деле (запускаю его на компьютере где собираюсь обрабатывать эти файлы), судя по всему изза того что у меня там часовой пояс GMT+6 зима стоит. Можно ли здесь чего такого придумать чтобы правильно все переименовывалось?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.11.2012, 13:00
Ответы с готовыми решениями:

Перемещение файла в соответствии с датой и временем в его имени
Есть папка "D:\1". В ней лежит много файлов с маской YYYYMMDD-HHmm-******.*** (часть имени и расширения могут быть разные). На пример: ...

Создать копию файла с датой и временем сохранения в имени
Здравствуйте. Есть такая небольшая подзадачка. Необходимо на документ excel прилепить кнопку, при нажатии на которую создавалась копия...

Создание документа с текущими датой и временем в имени
Вот так можно быстро создавать неповторяющиеся в отношении имени документы или папку уже в открытом виде. Сохранять естественно в...

10
887 / 189 / 16
Регистрация: 18.07.2011
Сообщений: 260
10.11.2012, 13:54
Перечислю первое, что попалось в глаза:
1. Слишком сложное добывание времени. FOR умеет сам определять время если переменная - файл:
Bash
1
for %%I in (*.*) do @echo Время: %%~tI, Имя: %%~nxI
2. setlocal парная команда. Это значит, что количество выполняемых SETLOCAL должно совпадать с количеством ENDLOCAL. Поэтому или SETLOCAL нужно перенести в 5 строку или ENDLOCAL в цикл, но правильнее перенести SETLOCAL.

Теперь по существу вопроса.
Не ясно, какой часовой пояс на машине пользователя и какая из машин имеет "правильный" часовой пояс.
2
3 / 3 / 0
Регистрация: 14.10.2012
Сообщений: 18
10.11.2012, 16:27  [ТС]
Косяк мой, endlocal в цикле должен быть, все правильно. Замудрежь с setlocal и endlocal внутри цикла вызван тем, что если их вынести оттуда, тогда не отображаются переменные US и u в названии - методом тыка подобрано

Файлы эти с аудиопишущих устойств - там GMT вроде как нет, просто время есть системное, оно забивается в время создания файла и именно оно и необходимо. Когда эти файлы переносишь на комп, на котором запускаю этот сценарий (часовой пояс GMT+6 зима на нем стоит), на нем в свойствах проводника неправильное время создания этих файлов (показывает на 5 часов ниже чем надо и это время как раз и прописывается сценарием в название файла)

На картинке время создания 6 сентября в 6:58, на самом деле файл создан 6 сентября в 11:58
Миниатюры
Переименование файла с датой и временем в имени с учетом GMT  
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
10.11.2012, 16:43
Вот скрипт для смены временной зоны.
Думаю, Вы поняли к чему я клоню.

Из альтернатив, подумайте о возможности сохранения даты/времени создания файла перед копированием и последующим восстановлением - после, с помощью внешней утилиты.
1
3 / 3 / 0
Регистрация: 14.10.2012
Сообщений: 18
10.11.2012, 22:08  [ТС]
Дискотека однако получается нехилая

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
chcp 1251
:: Чтобы правильно отразилась дата в названии файла он не должен быть скопирован из оригинальной локализации (только перемещен или обработан прямо из нее - при копировании меняются даты создания файла)
set "folder=%USERPROFILE%\Избранное"
set "mask=*.*"
:: Будем считать что GMT пишущих устройств +1, так как GMT компа +6 а разница при переносе файла становится +5
Set /a gmt=+1
 
:: Сначала считываем из реестра какой часовой пояс установлен (для Windows XP)
For /F "Tokens=2*" %%D In ('Reg Query "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Time Zones" /V TimeZoneKeyName') Do Set Active=%%E
Echo Активная часовая зона в реестре - %Active%
 
:: Теперь считываем что это за пояс и GMT (для Windows XP)
For /F "Tokens=2*" %%I In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\%Active%" /V Display') Do Set Display=%%J
Echo Значение часового пояса в реестре - %Display%
Echo Значение GMT - %Display:~4,3%
set /a data=%Display:~4,3%
Echo %data%
 
for /f "delims=" %%n in ('dir /b "%folder%\%mask%"') do (
    for /f "tokens=1-7 delims=:-/. " %%a in ('dir /tc "%folder%\%%n" ^|find " %%n"') do (
        setlocal enabledelayedexpansion
        Set /a HV=%%d
        Set /a HU=%data%+HV-gmt
        Set USB=%%n
        call :RND 10 50 u
        ren "%folder%\%%n" "%%c%%b%%a_!HU!%%e!u!_!USB:~0,11!%%~xn"
        endlocal
    )
)
pause
:: Секунды в сценарии отобразить невозможно, используем генератор случайных чисел для вставки секунд чтобы не было совпадения файлов
:RND
set MIN=%1
set MAX=%2
SET /A %3=%MIN%+(%MAX%-%MIN%+1)*%random%/32768
Работает, но на половину, интересная вещь получается, когда в файле час = 09, это число не воспринимается как число, происходит ошибка и вместо него прописывается 5 (в %data%+HV-gmt судя по всему 6 - 1, HV игнорируется). Где я опять накосячил?
Миниатюры
Переименование файла с датой и временем в имени с учетом GMT  
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
10.11.2012, 22:53
Да, есть такое.
Тонкости арифметики CMD.

Если там всегда 2-символьное число пробуйте так:
Bash
1
2
Set /a HV=1%%d
Set /a HV=!HV!-100
1
3 / 3 / 0
Регистрация: 14.10.2012
Сообщений: 18
10.11.2012, 23:42  [ТС]
Все работает, уважуха

Остался маленький нюанс, если час меньше 10 получается после обработки, то он отображается без нуля спереди (на рисунке, так отображается где время создания 09:09 и 09:03 соответственно). Тут что нибудь можно придумать?
Миниатюры
Переименование файла с датой и временем в имени с учетом GMT  
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
10.11.2012, 23:52
А прям вот так по Вашему условию и запишем:
Bash
1
if !HU! LSS 10 set HU=0!HU!
Тут, если условие истинно, переменная меняет тип с числовой на строковую с дописыванием нуля.
1
887 / 189 / 16
Регистрация: 18.07.2011
Сообщений: 260
11.11.2012, 00:53
Цитата Сообщение от Dimonsky Посмотреть сообщение
Тут что нибудь можно придумать?
Второй вариант решения:
Bash
1
2
set HU=0!HU!
set HU=!HU:~-2!
Приписали ноль спереди, и оставили две последние цифры.
1
3 / 3 / 0
Регистрация: 14.10.2012
Сообщений: 18
11.11.2012, 12:19  [ТС]
Благодарю, оба варианта работают

Ну и вроде как последний штрих - добавил внутри цикла преобразование времени (если час больше 23, чтобы не 24, 25 и т.д. записывались, а 00, 01 и т.д. со смещением дня на день вперед, так как это будут уже следующие сутки)
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
chcp 1251
:: Чтобы правильно отразилась дата в названии файла он не должен быть скопирован из оригинальной локализации (только перемещен или обработан прямо из нее - при копировании меняются даты создания файла)
set "folder=%USERPROFILE%\Избранное"
:: Тут можно задать че за файл и отфильтровать в случае необходимости
set "mask=*.amr"
:: Будем считать что GMT пишущих устройств +1, так как GMT компа +6 а разница при переносе файла становится +5
Set /a gmt=+1
 
:: Сначала считываем из реестра какой часовой пояс установлен (для Windows XP)
For /F "Tokens=2*" %%D In ('Reg Query "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Time Zones" /V TimeZoneKeyName') Do Set Active=%%E
Echo Активная часовая зона в реестре - %Active%
:: Теперь считываем что это за пояс и достаем из него GMT (для Windows XP)
For /F "Tokens=2*" %%I In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\%Active%" /V Display') Do Set Display=%%J
Echo Значение часового пояса в реестре - %Display%
Echo Значение GMT - %Display:~4,3%
set /a data=%Display:~4,3%
Echo %data%
 
:: Основной цикл (преобразуем особенности арифметики CMD, вычисляем час, если он больше 23 отнимаем 24 для приведения в нормальный вид и добавляем день, преобразуем особенности арифметики CMD, преобразуем час с нулем спереди в нормальный вид, вставляем кусок из 11 символов от предыдущего файла, синтезируем секунды, переименовываем)
for /f "delims=" %%n in ('dir /b "%folder%\%mask%"') do (
    for /f "tokens=1-7 delims=:-/. " %%a in ('dir /tc "%folder%\%%n" ^|find " %%n"') do (
        setlocal enabledelayedexpansion
        Set /a HV=1%%d
        Set /a HV=!HV!-100
        Set /a HU=%data%+HV-gmt
        if !HU! GTR 23 (
            setlocal enabledelayedexpansion
            Set /a HU=!HU!-24 
            Set /a HD=1%%a 
            Set /a HD=!HD!-100+1
            endlocal
) else (
            Set /a HD=%%a
)
        if !HU! LSS 10 Set HU=0!HU!
        Set USB=%%n
        call :RND 10 50 u
        ren "%folder%\%%n" "%%c%%b!HD!_!HU!%%e!u!_!USB:~0,11!%%~xn"
        endlocal
    )
)
pause
:: Секунды в сценарии отобразить вроде как невозможно, используем генератор случайных чисел для вставки секунд чтобы не было совпадения файлов
:RND
set MIN=%1
set MAX=%2
SET /A %3=%MIN%+(%MAX%-%MIN%+1)*%random%/32768
но цепочка с преобразованием дня таким же образом как часа почему-то не работает, не добавляется ноль (отмечено черным на рисунке - дата файла 20120101) и пустое значение для 09 (красным - дата 20120309). Подскажите, где косяк?
Изображения
 
0
3 / 3 / 0
Регистрация: 14.10.2012
Сообщений: 18
11.11.2012, 14:47  [ТС]
Чет я тупанул с утреца
Все работает
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
chcp 1251
:: Чтобы правильно отразилась дата в названии файла он не должен быть скопирован из оригинальной локализации (только перемещен или обработан прямо из нее - при копировании меняются даты создания файла)
set "folder=%USERPROFILE%\Избранное"
:: Тут можно задать че за файл и отфильтровать в случае необходимости
set "mask=*.amr"
:: Будем считать что GMT пишущих устройств +1, так как GMT компа +6 а разница при переносе файла становится +5
Set /a gmt=+1
 
:: Сначала считываем из реестра какой часовой пояс установлен (для Windows XP)
For /F "Tokens=2*" %%D In ('Reg Query "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Time Zones" /V TimeZoneKeyName') Do Set Active=%%E
Echo Активная часовая зона в реестре - %Active%
:: Теперь считываем что это за пояс и достаем из него GMT (для Windows XP)
For /F "Tokens=2*" %%I In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\%Active%" /V Display') Do Set Display=%%J
Echo Значение часового пояса в реестре - %Display%
Echo Значение GMT - %Display:~4,3%
set /a data=%Display:~4,3%
Echo %data%
 
:: Основной цикл (преобразуем особенности арифметики CMD, вычисляем час, если он больше 23 отнимаем 24 для приведения в нормальный вид и добавляем день, преобразуем особенности арифметики CMD, преобразуем час с нулем спереди в нормальный вид, вставляем кусок из 11 символов от предыдущего файла, синтезируем секунды, переименовываем)
for /f "delims=" %%n in ('dir /b "%folder%\%mask%"') do (
    for /f "tokens=1-7 delims=:-/. " %%a in ('dir /tc "%folder%\%%n" ^|find " %%n"') do (
        setlocal enabledelayedexpansion
        Set /a HV=1%%d
        Set /a HV=!HV!-100
        Set /a HU=%data%+HV-gmt
        if !HU! GTR 23 (
            Set /a HU=!HU!-24 
            Set /a HD=1%%a 
            Set /a HD=!HD!-100+1
            if !HD! LSS 10 Set HD=0!HD!
) else (
            Set /a HD=1%%a 
            Set /a HD=!HD!-100
            if !HD! LSS 10 Set HD=0!HD!
)
        if !HU! LSS 10 Set HU=0!HU!
        Set USB=%%n
        call :RND 10 50 u
        ren "%folder%\%%n" "%%c%%b!HD!_!HU!%%e!u!_!USB:~0,11!%%~xn"
        endlocal
    )
)
pause
:: Секунды в сценарии отобразить вроде как невозможно, используем генератор случайных чисел для вставки секунд чтобы не было совпадения файлов
:RND
set MIN=%1
set MAX=%2
SET /A %3=%MIN%+(%MAX%-%MIN%+1)*%random%/32768
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2012, 14:47
Помогаю со студенческими работами здесь

Создание папки с текущими датой и временем в имени с использованием контекстного меню
Приветствую форумчане. Такой вопрос: как реализовать корректно ? К примеру, если *.cmd файл с командой md...

Сохранение файла с текущей датой и временем в названии файла
Подскажите как в программе сохранять скриншоты с текущей датой и временем в названии файла из pictureBox?

Сохранение файла с датой и временем в названии
Нужно сохранить текст из Memo1 в текстовый документ, имя которого будет дата и время сохранения Вот код: procedure...

Вычислить промежуток времени между текущей датой/временем и временем, введенным пользователем
Создайте новое приложение. Пакет приложения назовите com.ВАШЕ_ИМьЯ.time_span. Функционал приложения следующий: пользователь вводит дату...

Unixtime на начало дня с учетом GMT
Не получается узнать unixtime на начало дня. Время на клиенте +5 к серверу. Пробовал функцию mktime() вида: $time = mktime(0,0,0)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru