正在跳过批处理文件中已重命名的文件以进行循环



我一直在试图找到一种方法,通过在所有匹配这种情况的文件中添加前缀(ZZSubs_(来重命名任何/所有字幕文件(.srt、.idx和.sub(。我还希望批处理文件在第二次意外运行时不要执行/跳过重命名。使用下面的代码,每次我运行批处理文件时,它都会不断地准备";ZZSubs_;到已经重命名的文件,即使我正在检查";ZZSubs_;带有IF NOT EXIST和星号*符号。

@ECHO OFF
CD /D "%~dp0"
for /F "delims=" %%i in ('dir /b *.SRT *.IDX *.SUB') do (
REM Rename Subtitle files with a ZZSubs_ filename prefix
IF NOT EXIST "ZZSubs_*%%i" RENAME "%%i" "ZZSubs_%%i"
)
PAUSE

这与下面提出的问题非常相似,但我也希望在给定文件夹的所有子目录中递归执行,而不是在特定的硬编码文件夹路径中执行:批量重命名:跳过已重命名的文件

如有任何帮助,我们将不胜感激。

for /F "delims=" %%i in ('dir /b *.SRT *.IDX *.SUB ^|findstr /v /b "ZZSubs_"') do (

应该是你需要的改变。这会将dir输出发送到findstr(需要插入符号来告诉cmd管道是要执行的命令的一部分,而不是for的一部分(。findstr命令查找所有不以字符串开头的行(/v((/b(。

假设您的代码使用一个名为ZZSubs_one.srt的文件来执行它。现在,ZZSubs_ZZSubs_one.srt存在吗?

这应该在cmd运行的windowsbatch-file中工作。如果您在受支持的Windows系统上,PowerShell将可用。当您确信文件将被正确重命名时,请从Rename-Item命令中删除-WhatIf

powershell -NoLogo -NoProfile -Command ^
"Set-Location -Path %~dp0;" ^
"Get-ChildItem -Path *.SRT,*.IDX,*.SUB |" ^
"ForEach-Object { if ($_.Name -notmatch '^ZZSubs_') { Rename-Item -Path $_.FullName -NewName ('ZZSubs_'+$_.Name) -WhatIf } }"

最新更新