Windows CMD 批量时间戳 WITH SECONDS

Windows CMD Batch Timestamp WITH SECONDS

我需要将日期修改时间戳批量附加到 Windows 10 中的文件名。我快到了。

答案 here 对我接近 objective 非常有帮助。

下面创建的批处理脚本附加了文件的 修改日期 ,但省略了秒数 YYYYMMDDHHMM 而不是 YYYYMMDDHHMMSS(我需要的)。

我电脑的日期格式是YYYY-MM-DD,时间格式是hh:mm:ss

我怎样才能做到这一点?

@echo off
FOR /R "J:\PHP Member Reports\Test" %%Z IN (*.TRN) DO @( 
    FOR /F "Tokens=1-6 delims=:-\/. " %%A IN ("%%~tZ") DO @(
        ren "%%~dpnxZ" "%%~A%%~B%%~C%%~D%%~E%%~F_%%~nZ%%~xZ"
    )
)

有必要使用 wmic – Windows Management Instrumentation 命令行实用程序 – 以秒为单位获取文件的最后修改日期。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "RenameError=0"
for /F "delims=" %%I in ('dir "J:\PHP Member Reports\Test\*.trn" /A-D-H /B /S 2^>nul') do call :ProcessFile "%%I"
if %RenameError% == 1 echo/ & pause
endlocal
goto :EOF

:ProcessFile
set "FileName=%~1"
set "FileName=%FileName:\=\%"
set "FileDate="

rem Get last modification date of current file using Windows Management
rem Instrumentation Command-line utility (WMIC) which requires that each
rem backslash is escaped with a backslash.
for /F "usebackq tokens=2 delims==." %%T in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE where "name='%FileName%'" GET LastModified /VALUE 2^>nul`) do set "FileDate=%%T"
if defined FileDate goto RenameFile

rem The command line above fails if a comma exists anywhere in
rem file name with full path. Use in this case a different syntax.
if not defined FileDate for /F "usebackq tokens=2 delims==." %%T in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE where (name^="%FileName%"^) GET LastModified /VALUE 2^>nul`) do set "FileDate=%%T"
if defined FileDate goto RenameFile

rem The command line above fails again if there is a comma and additionally
rem also a closing parenthesis in file name with full path. To workaround
rem this issue copy the file with name WmicFile.tmp to the directory for
rem temporary files of which path does not contain usually , and ) at the
rem same time and get last modification date from this file before deleting
rem this temporary file.

copy "%~1" "%TEMP%\WmicFile.tmp" >nul
set "FileName=%TEMP%\WmicFile.tmp"
set "FileName=%FileName:\=\%"
for /F "usebackq tokens=2 delims==." %%T in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE where "name='%FileName%'" GET LastModified /VALUE 2^>nul`) do set "FileDate=%%T"
del "%TEMP%\WmicFile.tmp"
if defined FileDate goto RenameFile

if %RenameError% == 1 echo/
echo ERROR: Failed to determine last modification date of file
echo        %1
set "RenameError=1"
goto :EOF

:RenameFile
set "FileName=%~n1"
rem Do nothing if current file name ends already with determined date/time.
if "%FileName:~-15%" == "_%FileDate%" goto :EOF
rem Rename the file with appending after an underscore the
rem last modification date and time in format YYYYMMDDhhmmss.
ren "%~1" "%~n1_%FileDate%%~x1" 2>nul
if not errorlevel 1 goto :EOF

if %RenameError% == 1 echo/
echo ERROR: Failed to rename the file
echo        %1
echo        to "%~n1_%FileDate%%~x1"
set "RenameError=1"
goto :EOF

使用命令 FOR 本身从目录或目录树中检索的文件名来重命名、移动、删除或复制 为了。这很容易导致遗漏文件或多次处理某些文件,因为在 FOR 处理目录条目时搜索目录中的条目列表发生变化。强烈建议在开始处理文件之前通过 FOR 完全处理文件名列表,尤其是在 FAT 驱动器(FAT16、FAT32、exFat)上,文件名不会返回完全按文件系统排序。

命令 DIRFOR 在以 cmd.exe /C 启动的后台命令进程中执行,输出处理 STDOUT 仅匹配通配符模式*.trn 的指定目录及其子目录中的所有非隐藏文件。 FOR 捕获了这个文件名列表,每个文件名都有完整路径。另请阅读有关 Using Command Redirection Operators 的 Microsoft 文章,了解 2>nul 的解释。重定向运算符 > 必须在 上使用脱字符 ^ 进行转义,以便在 Windows 命令解释器处理此命令时将其解释为文字字符 Windows执行命令 FOR 之前的行,它在后台启动的单独命令进程中执行嵌入式 dir 命令行。

每个具有完整路径的文件名都由 FOR 传递给用双引号括起来的子例程 ProcessFile 也适用于包含 [= 的文件 names/paths 166=] 或这些字符之一 &()[]{}^=;!'+,`~.

WMIC 语法要求每个文件名都用完整路径指定,文件路径中的每个反斜杠都用反斜杠转义。另请参阅我在 Find out if file is older than 4 hours in batch file 上的回答。

How to escape both comma and closing parenthesis in WHERE clause of WMIC? 说明包含逗号 , 或右括号 ) 的完整文件名是有问题的。编写批处理文件是为了解决这些问题。可以预期,第一次执行 FOR 命令行 WMIC 几乎总是已经成功地确定文件的最后修改日期与第二个。

如果无法确定文件的最后修改日期,则写入批处理文件以输出错误消息。

如果文件名已经以下划线结尾且最后一次修改正确 date/time,则不执行重命名。

如果重命名操作成功并在文件重命名失败时显示错误消息,则由批处理文件进行验证。

注意: 批处理文件不会通过正确的最后修改 date/time 来替换文件名末尾的 YYYYMMDDhhmmss。这不是问题所要求的。

如果子例程 ProcessFile 中发生任何错误,批处理文件将在命令 PAUSE 结束时停止执行。否则批处理文件的执行结束,没有任何用户信息输出到 STDOUT (console window).

请注意WMIC需要相当长的时间才能完成操作。因此,对于大量文件,此批处理文件可能需要几分钟才能完成。

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /?
  • copy /?
  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • rem /?
  • ren /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic datafile /?
  • wmic datafile get /?
  • wmic datafile get "last modified" /?
  • wmic datafile where /?

另请参阅:

您可能可以使用 RoboCopy 来执行此操作,据我所知,它提供了一个不依赖于区域设置的日期和时间。 (仅对行 34 进行必要的修改)

@Echo Off

Set "filePath=J:\PHP Member Reports\Test"
Set "fileSpec=*.TRN"

Set "RCO=/S /L /XJ /R:0 /TS /FP /NS /NC /NP /NDL /NJH /NJS"
For /F "Tokens=1-6* Delims=/:    " %%A In (
    'RoboCopy "%filePath%" Null "%fileSpec%" %RCO%'
) Do If Not Exist "%%A%%B%%C%%D%%E%%F%%~xG" (
    Echo=Ren "%%G" "%%A%%B%%C%%D%%E%%F%%~xG")
Pause

其中Delims=/:<tab><space>/:Tab

脚本目前只有Echo包含Rename命令;如果您对结果满意,请从第 10 行删除 Echo= 并从最后一行删除 Pause

另请注意,这只是为了回答您的问题。因重命名文件以匹配文件规范或现有文件而产生的任何问题都需要单独处理。