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

在Windows上使用CMD从文件目录中删除特定子字符串,windows,cmd,substring,Windows,Cmd,Substring,我经常使用免费的在线无损文件压缩程序来节省磁盘空间,使传输和推送repo更容易。我对压缩器的主要问题是它在每个文件名的末尾附加-min。出于各种原因,我想通过覆盖原始文件来替换它们;而不是删除旧文件并使用新名称保留新文件 对于我的PDF目录,我尝试了以下方法: 对于*min.pdf中的/R%f,请执行%f*.pdf 它似乎正确地找到了所有相应的文件,但它们的名称保持不变。我做错了什么?有没有一个命令是文件格式不可知的,这样我就不必为txt、png等指定文件扩展名 我只需要它在文件扩展名之前从每个

我经常使用免费的在线无损文件压缩程序来节省磁盘空间,使传输和推送repo更容易。我对压缩器的主要问题是它在每个文件名的末尾附加-min。出于各种原因,我想通过覆盖原始文件来替换它们;而不是删除旧文件并使用新名称保留新文件

对于我的PDF目录,我尝试了以下方法: 对于*min.pdf中的/R%f,请执行%f*.pdf

它似乎正确地找到了所有相应的文件,但它们的名称保持不变。我做错了什么?有没有一个命令是文件格式不可知的,这样我就不必为txt、png等指定文件扩展名


我只需要它在文件扩展名之前从每个文件名的末尾删除-min即可。

此任务可以使用具有以下命令行的批处理文件来完成:

@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
由FOR在后台以%ComSpec%/c启动的单独命令进程执行的命令DIR和作为附加参数附加的命令行之间的命令行还输出文件名,如Test file-具有完整路径的min.x.pdf。由于这个原因,IF条件确保只重命名文件名以类似字符串min的测试文件结尾的文件-MIN.pdf

有关2>nul的说明,请阅读有关的Microsoft文档。在Windows命令解释器处理此命令行时,必须使用插入符号^on转义重定向运算符>,才能将命令行解释为文字字符,然后再执行在后台启动的单独命令进程中为其执行嵌入的dir命令行的命令

要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

呼叫/。。。解释dp0。。。参数0的驱动器和路径,它是批处理文件的完整路径,始终以反斜杠结尾,因此与通配符模式*-min.*连接,不带额外的反斜杠。%~可以删除dp0以在当前目录及其所有子目录上运行DIR,而不是在批处理文件目录及其所有子目录上运行DIR。 目录/? 回声/? endlocal/? 如果/? 任/? 集/? setlocal/?
有关命令SETLOCAL和ENDLOCAL的更多详细信息,请参见。

可以使用具有以下命令行的批处理文件来完成该任务:

@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
由FOR在后台以%ComSpec%/c启动的单独命令进程执行的命令DIR和作为附加参数附加的命令行之间的命令行还输出文件名,如Test file-具有完整路径的min.x.pdf。由于这个原因,IF条件确保只重命名文件名以类似字符串min的测试文件结尾的文件-MIN.pdf

有关2>nul的说明,请阅读有关的Microsoft文档。在Windows命令解释器处理此命令行时,必须使用插入符号^on转义重定向运算符>,才能将命令行解释为文字字符,然后再执行在后台启动的单独命令进程中为其执行嵌入的dir命令行的命令

要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

呼叫/。。。解释dp0。。。参数0的驱动器和路径,它是批处理文件的完整路径,始终以反斜杠结尾,因此与通配符模式*-min.*连接,不带额外的反斜杠。%~可以删除dp0以在当前目录及其所有子目录上运行DIR,而不是在批处理文件目录及其所有子目录上运行DIR。 目录/? 回声/? endlocal/? 如果/? 任/? 集/? setlocal/? 有关SETLOCAL和ENDLOCAL命令的更多详细信息,请参见

对于*min.pdf中的/R%f,请执行%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中的内容基本相同

对于*min.pdf中的/R%f,请执行%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中的内容基本相同


为变量%f分配的是整个文件名,而不是*匹配的部分;因此,您正在使用重命名文件
同名。你必须做一些字符串处理,这在Windows批处理中是一件相当棘手的事情,我不认为它可以在一行命令中完成。如果%f是文件名,则表达式%%nf返回不带扩展名的名称;%s:0,-4%返回字符串s的最后4个字符以外的所有字符,依此类推。搜索windows批处理字符串处理。为变量%f分配的是整个文件名,而不是*匹配的部分;因此,您正在使用相同的名称重命名该文件。你必须做一些字符串处理,这在Windows批处理中是一件相当棘手的事情,我不认为它可以在一行命令中完成。如果%f是文件名,则表达式%%nf返回不带扩展名的名称;%s:0,-4%返回字符串s的最后4个字符以外的所有字符,依此类推。搜索窗口批处理字符串。它与@Mofi的答案本质上不同。for/R在获得第一个结果后立即传递给do as命令,并在迭代时继续传递。这意味着对do命令中文件名的任何更改都可以再次循环到running for/R命令中。在这种情况下,当您删除-min子字符串时,这不会影响任何事情,这是一个重要的区别;因为Mofi的括号中的命令方法在传递给do部分之前都经过了处理。由于这是标记为cmd的文件,而不是批处理文件,所以在这种情况下,您的文件会更正确。@Compo很好。我使用for/R使其接近OP的尝试,实际上,循环限制为*-min.pdf,因此重命名的文件与通配符不匹配。另一个不同之处是,以这种方式编写的循环可以很好地处理活动代码页之外带有国际字符的文件名。它与@Mofi的答案本质上不同。for/R在获得第一个结果后立即传递给do as命令,并在迭代时继续传递。这意味着对do命令中文件名的任何更改都可以再次循环到running for/R命令中。在这种情况下,当您删除-min子字符串时,这不会影响任何事情,这是一个重要的区别;因为Mofi的括号中的命令方法在传递给do部分之前都经过了处理。由于这是标记为cmd的文件,而不是批处理文件,所以在这种情况下,您的文件会更正确。@Compo很好。我使用for/R使其接近OP的尝试,实际上,循环限制为*-min.pdf,因此重命名的文件与通配符不匹配。另一个不同之处是,以这种方式编写的循环可以很好地处理活动代码页之外带有国际字符的文件名。