Мне нужно получить дату изменения файла, хранящегося в переменной, например: YearMonthDayHourMinute . Так 01/21/2019 9:12 AM будет 201901210912 . Что я буду делать, так это сравнивать файлы, чтобы увидеть, что новее, поэтому должно быть так в 24-часовом формате. Я изначально собирался получить его с помощью этой команды: for %? IN ("%cd%\out.txt") do (echo %~t?) и использовать цикл for для разделения выходных данных, но мне было интересно, зависит ли дата модификации цикла for от языка, например %date%? Если это так, есть ли способ проверить, в каком формате он находится, или есть способ получить не зависящую от локали дату модификации?

Это связано с тем, почему не установлены переменные этой функции?Пакетный код, но я не вижу, как решение одного обязательно изменит другой, поэтому я оставляю их как отдельные вопросы.

1 ответ1

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 .

В приведенном фрагменте кода есть две проблемы:

: Подпрограмма :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

==>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .