答案 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)