我正在尝试编写一个批处理文件,它遍历每个文件名、获取部分字符串并设置创建和修改日期。请注意,dirpath 是实际路径的占位符。
@echo off
setlocal enabledelayedexpansion
FOR /R dirpath %F in (*.*) DO (SET FNAME=%~nF SET MM=%FNAME:~0,2% SET DD=%FNAME:~2,2% SET YY=%FNAME:~4,2% nircmd.exe setfiletime %F "%DD% %MM%-20%YY% 00:00:00" "%DD%-%MM%-20%YY% 00:00:00")
我甚至不确定如何排除脚本的故障 - 循环后暂停不会暂停程序。如何将其重写为函数?
答案1
如何将其重写为函数?
您的批处理文件存在许多问题:
- 不是
%f
。您需要使用%%f
。%f
是命令行,需要至少在 3 处进行修复。 - 我会将命令放在
do ( ... )
不同的行内。 - 你可以在结束前暂停一下
)
- 您可以注释掉第一行来
rem
查看批处理文件正在执行的操作。 - 添加
echo
到有效载荷行中nircmd
。 echo
当您认为它正在工作时将其移除。- 你需要在某些地方使用
!
而不是在循环%
内for
(这就是enabledelayedexpansion
for - 它允许变量在执行时而不是在解析时扩展
从以下批处理文件开始(我已经为您修复了主要的错误):
@echo off
setlocal enabledelayedexpansion
for /r dirpath %%F in (*.*) DO (
set FNAME=%%~nF
SET MM=!FNAME:~0,2!
SET DD=!FNAME:~2,2!
SET YY=!FNAME:~4,2!
echo nircmd.exe setfiletime %%F "!DD!-!MM!-20!YY! 00:00:00" "!DD!-!MM!-20!YY! 00:00:00"
pause
)
endlocal
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 启用延迟扩展- 延迟扩展将导致变量在执行时而不是在解析时扩展。
- 对于/r- 循环遍历文件(递归子文件夹)。
- 放- 显示、设置或删除 CMD 环境变量。使用 SET 所做的更改将仅在当前 CMD 会话期间保留。
- 设置本地- 设置选项来控制批处理文件中环境变量的可见性。
答案2
我通过简单地调用函数找到了另一个解决方案。
FOR /R dirname %%F in (*.*) DO call :Setfiletime %%F
goto End
:Setfiletime
SET FNAME=%~n1
echo %FNAME%
SET MM=%FNAME:~0,2%
SET DD=%FNAME:~2,2%
SET YY=%FNAME:~4,2%
nircmd.exe setfiletime %1 "%DD%-%MM%-20%YY%" "%DD%-%MM%-20%YY%"
:goto :eof
:End
感谢大家的帮助。