在 Windows 上使用 CMD 从文件目录中删除特定的子字符串



我经常使用免费的在线无损文件压缩器来节省磁盘空间,并使传输和推送存储库更容易。我对压缩器的主要问题是它将"-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的原因。

命令DIRFOR在后台启动的单独命令进程执行,%ComSpec% /c'之间的命令行作为附加参数输出,也输出文件名,如具有完整路径的Test-File!-min.x.pdf。出于这个原因,IF条件确保仅重命名文件名真正以不区分大小写结尾的文件,字符串-minTest-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 /?

另请参阅此答案,了解有关命令SETLOCALENDLOCAL的详细信息。

最新更新