我经常使用免费的在线无损文件压缩器来节省磁盘空间,并使传输和推送存储库更容易。我对压缩器的主要问题是它将"-min"附加到每个文件名的末尾。由于各种原因,我想通过覆盖原始文件来替换它们;而不是删除旧文件并保留新文件(使用"新"名称(。
对于我的 PDF 目录,我尝试了这个: 对于/R %f IN (*-min.pdf( 执行 REN "%F" *.pdf
它似乎正确找到了所有相应的文件,但它们的名称保持不变。我做错了什么?是否有一个与文件格式无关的命令,所以我不必为 txt、png 等替换文件扩展名?
我只需要它从每个文件名的末尾(在文件扩展名之前(删除 -min。
FOR /R %f IN (*-min.pdf) DO REN "%f" *.pdf
对于单行(在 cmd 提示符处(,请从以下内容中删除echo
。
cmd /v:on /c "for /R %f in (*-min.pdf) do @set "nx=%~nxf" & echo ren "%~ff" "!nx:-min.pdf=.pdf!""
上面的内容可以很容易地更改以执行其他字符串操作,但它在技术上并非万无一失,例如,它将一个名为"a-min.pdf.b-min.pdf-c-min.pdf"
的文件重命名为"a.pdf.b.pdf-c.pdf."
。如果在这种情况下这是一个问题,请使用以下内容,它与@Mofi的答案基本相同。
cmd /v:on /c "for /R %f in (*-min.pdf) do @set "nn=%~nf" & echo ren "%~ff" "!nn:~0,-4!%~xf""
可以使用具有以下命令行的批处理文件完成该任务:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "delims=" %%I in ('dir "%~dp0*-min.*" /A-D /B /S 2^>nul') do (
set "FullFileName=%%I"
set "FileNameOnly=%%~nI"
set "FileExtension=%%~xI"
setlocal EnableDelayedExpansion
if /I "!FileNameOnly:~-4!" == "-min" ren "!FullFileName!" "!FileNameOnly:~0,-4!!FileExtension!"
endlocal
)
endlocal
两次使用的负值-4
必须与要从文件名末尾删除的字符串长度匹配,以保留文件扩展名。字符串-min
的长度为四个字符,这就是在这里使用两次-4
的原因。
命令DIR由FOR在后台启动的单独命令进程执行,%ComSpec% /c
和'
之间的命令行作为附加参数输出,也输出文件名,如具有完整路径的Test-File!-min.x.pdf
。出于这个原因,IF条件确保仅重命名文件名真正以不区分大小写结尾的文件,字符串-min
如Test-File!-MIN.pdf
.
阅读有关使用命令重定向运算符的Microsoft文档,了解2>nul
的说明。当 Windows 命令解释器在执行命令 FOR 之前处理此命令行时,重定向运算符>
必须在FOR命令行上使用插入符号^
进行转义,以将其解释为文字字符,该命令使用在后台启动的单独命令进程执行嵌入的dir
命令行。
该代码甚至适用于完全限定文件名(驱动器 + 路径 + 名称 + 扩展名(包含一个或多个感叹号的文件,因为延迟变量扩展仅对最终重命名文件的命令行启用。
只要没有文件在其完全限定的文件名中包含一个或多个!
,就可以通过永久启用的延迟变量扩展更快地完成文件重命名任务。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "delims=" %%I in ('dir "%~dp0*-min.*" /A-D /B /S 2^>nul') do (
set "FileNameOnly=%%~nI"
if /I "!FileNameOnly:~-4!" == "-min" ren "%%I" "!FileNameOnly:~0,-4!%%~xI"
)
endlocal
由于文件名!
,此代码不适用于将Test-File!-MIN.pdf
重命名为Test-File!.pdf
。
要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,然后完整而仔细地阅读每个命令的显示帮助页面。
call /?
......解释%~dp0
...参数 0 的驱动器和路径,这是始终以反斜杠结尾的批处理文件的完整路径。因此,它与通配符模式连接*-min.*
,没有额外的反斜杠。 可以删除%~dp0
以在当前目录及其所有子目录上运行DIR,而不是批处理文件目录及其所有子目录。dir /?
echo /?
endlocal /?
if /?
ren /?
set /?
setlocal /?
另请参阅此答案,了解有关命令SETLOCAL和ENDLOCAL的详细信息。