删除文件名的开头 Bat 文件

时间:2021-04-02 05:45:06

标签: batch-file rename

enter image description here

大家好,

我正在寻找一个可以运行的批处理文件,它将搜索该文件夹中的每个文件(不是子文件夹)并重命名每个文件的字符串,删除字符串的第一部分,直到“-”之后 有关示例,请参阅所附图片。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以利用带有字符串替换的通配符。它是非贪婪的,因此您可以使它从文件名中删除所有内容,直到第一次找到 {space hyphen space}。

@echo off
setlocal EnableExtensions DisableDelayedExpansion

for /F "eol=| delims=" %%G in ('dir /B /A-D-H "* - *.*" 2^>nul') do (
    set "string=%%G"
    setlocal enabledelayedexpansion
    SET "end=!string:* - =!"
    rename "%%G" "!end!"
    endlocal
)

@Compo 向您展示了如何使用 FINDSTR 来不解析具有特定扩展名的文件。以下是如何使用 FOR 命令修饰符和比较来执行相同的操作。

@echo off
setlocal EnableExtensions DisableDelayedExpansion

for /F "eol=| delims=" %%G in ('dir /B /A-D-H "* - *.*" 2^>nul') do (
    IF /I NOT "%%~xG"==".msg" ( 
        set "string=%%G"
        setlocal enabledelayedexpansion
        SET "end=!string:* - =!"
        rename "%%G" "!end!"
        endlocal
    )
)

答案 1 :(得分:1)

类似于 Squashman 的回答,只是在此版本中不使用 delayedexpansion。修正以排除 .msg 文件扩展名。

@echo off
for /f "delims=" %%i in ('dir /b /a-d "* - *.*"') do if /i not "%%~xi" == ".msg" set "file=%%~i" && call :ren
goto :eof
:ren
ren "%file%" "%file:*- =%"

答案 2 :(得分:1)

这是另一种选择,它使用与现有答案相同的方法删除所有内容,直到并包括第一个空格连字符空间实例,但使用不同的方法来识别这些文件,即 where.exe

@Echo Off & SetLocal EnableExtensions DisableDelayedExpansion
For /F "Delims=" %%G In ('(Set PATHEXT^=^) ^& %SystemRoot%\System32\where.exe
 "%~dp0.":"?* - ?*" 2^>NUL') Do (Set "FileName=%%~nxG"
    SetLocal EnableDelayedExpansion
    Ren "%%G" "!FileName:* - =!" & EndLocal)

并且,作为 subsequent question 的扩展名,(现已关闭),以下示例使用 findstr.exe 排除任何带有 .msg 扩展名的文件:

@Echo Off & SetLocal EnableExtensions DisableDelayedExpansion
For /F "Delims=" %%G In ('(Set PATHEXT^=^) ^& %SystemRoot%\System32\where.exe
 "%~dp0.":"?* - ?*" 2^>NUL ^| %SystemRoot%\System32\findstr.exe /LIV ".msg"'
) Do (Set "FileName=%%~nxG" & SetLocal EnableDelayedExpansion
    Ren "%%G" "!FileName:* - =!" & EndLocal)

此外,由于正文和已结束问题的标题之间存在差异,如果您只想重命名 .msg 文件,而保持其他文件不变,则:

@Echo Off & SetLocal EnableExtensions DisableDelayedExpansion
For /F "Delims=" %%G In ('(Set PATHEXT^=^) ^& %SystemRoot%\System32\where.exe
 "%~dp0.":"?* - ?*.msg" 2^>NUL') Do (Set "FileName=%%~nxG"
    SetLocal EnableDelayedExpansion
    Ren "%%G" "!FileName:* - =!" & EndLocal)