如何获取与语言环境无关的修改日期批次

如何获取与语言环境无关的修改日期批次

我需要获取文件的修改日期存储在这样的变量中: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>)。

查看 Dave Benham 的WMICFOR /F:修复尾随<CR>问题

输出

==> D:\bat\SU\1396664.bat
LastModified    20190201220347.477320+060
_ForString=D:\\bat\\SU\\1396664.bat
_LastModified=20190201220347.477320+060

==>

相关内容