如何使批处理脚本删除感叹号“!”从文件名?

问题描述 投票:0回答:1

我想使用批处理脚本删除 Windows 10/11 上文件名中的感叹号。

我在与批处理文件相同的目录中有一个名为“Input”的文件夹,我只想让批处理文件在Input文件夹中查找文件名中带有感叹号的文件,然后删除所有感叹号。

举个例子:

this!_is!_an!_example!!!.txt

将更名为:

this_is_an_example.txt

下面的批处理脚本将删除字符“”。但是,如果我将其更改为“!”它不再起作用,可能是因为

enabledelayedexpansion
存在感叹号问题:

@echo off &setlocal
chcp 65001>nul
cd /d "C:\input"
for /f "delims=" %%a in ('dir /b /a-d *Â*.txt') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:Â=!"
    ren "!fname!" "!nname!"
    endlocal
)
pause
windows batch-file rename
1个回答
0
投票

如果启用了延迟变量扩展,感叹号始终被解释为延迟扩展变量引用的开始/结束。必须有一个子例程用于重命名包含一个或多个

!
的文件,并在禁用延迟变量扩展的情况下从文件名中删除它们。

@echo off & setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\chcp.com 65001 1>nul
cd /D "C:\input"
(for /F "eol=| delims=" %%I in ('dir "*!*" /A-D /B 2^>nul') do set "FileName=%%I" & call :RenameFile) & pause & exit /B
:RenameFile
ren "%FileName%" "%FileName:!=%" & goto :EOF

此批处理文件设计为通过双击 Windows 文件资源管理器 或任何其他文件管理器来执行,从而导致执行

%ComSpec% /C
并附加完全限定的文件名作为执行的 Windows 命令处理器 的另一个参数执行它来处理批处理文件,然后自行关闭。

如果应在打开的命令提示符窗口中使用批处理文件或应从另一个批处理文件调用批处理文件,则最好使用以下批处理文件:

@echo off & setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=*" %%G in ('%SystemRoot%\System32\chcp.com') do for %%H in (%%G) do set /A "CodePage=%%H" 2>nul
%SystemRoot%\System32\chcp.com 65001 1>nul
cd /D "C:\input"
(for /F "eol=| delims=" %%I in ('dir "*!*" /A-D /B 2^>nul') do set "FileName=%%I" & call :RenameFile) & goto EndBatch
:RenameFile
ren "%FileName%" "%FileName:!=%" & goto :EOF
:EndBatch
%SystemRoot%\System32\chcp.com %CodePage% 1>nul
endlocal

此版本在退出之前恢复初始环境,包括代码页以及当前工作目录、命令扩展状态和延迟变量扩展状态,这也由第一个批处理文件恢复,因为在

endlocal
之前隐式执行
cmd.exe
最后退出批处理文件的处理。

请参阅 DosTips 论坛帖子 [信息] 保存当前代码页,了解第二个批处理文件中第二个命令行的说明。

© www.soinside.com 2019 - 2024. All rights reserved.