gpt4 book ai didi

windows - Windows CMD批处理时间戳记(秒)

转载 作者:可可西里 更新时间:2023-11-01 11:44:35 25 4
gpt4 key购买 nike

我需要批量追加一个日期修改的时间戳到一个文件名在Windows10。我就快到了。
答案对我接近目标非常有帮助。
下面创建的批处理脚本会附加文件的修改日期,但会忽略秒而不是(我需要的)。
我的计算机的日期格式是YYYYMMDDHHMM,时间格式是YYYYMMDDHHMMSS
我怎样才能做到这一点?

@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 get完全处理文件名列表,特别是在文件系统完全不排序的fat驱动器(fat16、fat32、exfat)上。
命令dir由for在以 cmd.exe /C开头的后台命令进程中执行,该进程只输出处理指定目录及其子目录中与通配符模式匹配的所有非隐藏文件的stdout。此文件名列表(每个文件名都具有完整路径)由for捕获。同时阅读微软关于 Using Command Redirection Operators的文章,了解 *.trn的解释。重定向运算符 2>nul必须用插入符号 >转义,以便在windows命令解释器在执行命令之前处理此命令行时,将命令行解释为文本字符,而该命令行在单独的命令进程中执行嵌入的 ^命令行。从后台开始。
每个带有完整路径的文件名都被传递给子例程 dir并用双引号括起来,以便对包含空格或其中一个字符 ProcessFile的文件名/路径也起作用。
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?解释了包含逗号 &()[]{}^=;!'+,`~或右括号 ,的完整文件名存在问题。编写批处理文件是为了解决这些问题。可以预期,使用wmic执行的第一个命令行在使用第二个命令行确定文件的最后修改日期时几乎总是已经成功的。
如果无法确定文件的最后修改日期,则写入批处理文件以输出错误消息。
如果文件名已以下划线和正确的上次修改日期/时间结尾,则不执行重命名。
批处理文件将验证重命名操作是否成功,并在“文件重命名失败”上显示错误消息。
注意:批处理文件不会被写入以用该文件的正确上次修改日期/时间替换文件名末尾的 )。这不是必须的。
如果在子例程 YYYYMMDDhhmmss中发生任何错误,批处理文件将在命令暂停结束时停止执行。否则,批处理文件的执行将在没有任何用户信息输出到stdout(控制台窗口)的情况下结束。
请注意,WMIC需要很长时间才能完成操作。因此,在大文件列表中,此批处理文件可能需要几分钟才能完成。
为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页。
ProcessFile
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" /?
参见:
Microsoft支持文章 Testing for a Specific Error Level in Batch Files
堆栈溢出问题的答案 Where does GOTO :EOF return to?
dostips论坛主题 ECHO. FAILS to give text or blank line - Instead use ECHO/

关于windows - Windows CMD批处理时间戳记(秒),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48481786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com