Как получить независимую от локали дату модификации пакета
Мне нужно получить дату изменения файла, хранящегося в переменной, как это: YearMonthDayHourMinute
, Так 01/21/2019 9:12 AM
было бы 201901210912
, То, что я буду делать, это сравнивать файлы, чтобы увидеть, что новее, поэтому должно быть так в 24-часовом формате. Я изначально собирался получить его с помощью этой команды: for %? IN ("%cd%\out.txt") do (echo %~t?)
и использовать цикл for для разделения выходных данных, но мне было интересно, если дата изменения цикла for зависит от локали, как %date%
? Если это так, есть ли способ проверить, в каком формате он находится, или есть способ получить не зависящую от локали дату модификации?
Это связано с тем, почему не установлены переменные этой функции? Пакетный код, но я не вижу, как решение одного обязательно изменит другой, поэтому я оставляю их как отдельные вопросы.
1 ответ
set _ForString=%~1 set _ForString=!_ForString:\=\\! For /f "tokens=1,2* delims==" %%a in ('wmic datafile where name="!_ForString!" get LastModified /format:list') do ( echo %%a %%b set %~2=%%b ) Rem %1 is set to C:\Users\%username%\CMDS.bat
Я на самом деле получаю ошибку
C:\\Users\\theBATeam\\CMDS.bat - Invalid alias verb
,
В приведенном фрагменте кода есть две проблемы:
- в
name="!_ForString!"
: вам нужно экранировать знак равенства какname^="!_ForString!"
; - разбор
wmic
вывод вFOR /F
цикл (объяснено ниже).
:ParseWmicDatafile
подпрограмма в следующем прокомментирован .bat
скрипт должен сделать работу:
@ECHO OFF
SETLOCAL EnableExtensions
call :ParseWmicDatafile "%~f0" LastModified
REM show all variables prefixed with an underscore
set _
goto :eof
:ParseWmicDatafile
REM inputs (by value): %1 is a fully qualified file name
REM %2 is a valid "wmic datafile" property name
REM outputs (by reference): _%~2 is a variable name drawn from supplied %2:
REM property name prefixed with an underscore
REM _ForString
REM remove residuary variable _%~2 (if present)
if defined _%~2 set "_%~2="
set "_ForString=%~1"
set "_ForString=%_ForString:\=\\%"
for /f "tokens=1* delims==" %%A in (
'wmic datafile where name^="%_ForString%" get %~2 /format:list'
) do for /f "delims=" %%b in ("%%~B") do (
echo %%A %%b
set "_%~2=%%b"
)
goto :eof
Здесь for
петли
%%A
чтобы получитьLastModified
имя свойства (%%A
) и стоимость (%%B
);%%b
удалить возврат конца каретки в возвращаемом значении;wmic
поведение: каждая строка вывода заканчивается0x0D0D0A
(<CR><CR><LF>
) вместо общего0x0D0A
(<CR><LF>
).
Смотрите Дейва Бенхама WMIC
а также FOR /F
: Исправление для трейлинга <CR>
проблема
Выход:
==> D:\bat\SU\1396664.bat
LastModified 20190201220347.477320+060
_ForString=D:\\bat\\SU\\1396664.bat
_LastModified=20190201220347.477320+060
==>