我有一个包含大量文件的文件夹。很多文件名中都包含“%”和/或“&”字符。
e.g. Test&doc.pdf
e.g Test%doc.doc
有没有一种快速的方法能够通过windows批处理文件、vbscript或类似的方式删除“%”和“&”字符?
非常感谢您的帮助。
谢谢。
我有一个包含大量文件的文件夹。很多文件名中都包含“%”和/或“&”字符。
e.g. Test&doc.pdf
e.g Test%doc.doc
以下是批处理的执行方法(如果您感兴趣)。 但是,如果您的文件名中包含多个百分号,则无法使用此方法,因为shell将其扩展为变量。 我不知道如何立即解决这个问题。
它从脚本所在的任何目录开始,并递归地遍历所有子目录。
@echo off
setlocal enabledelayedexpansion
for /f "usebackq delims=" %%N in (`dir /s /b`) do (
set var=%%~nN
set var=!var:^&= !
set var=!var:%%= !
if not "!var!"=="%%~nN" (
if not exist "%%~dpN!var!%%~xN" (
echo "%%N" --^> "!var!%%~xN"
ren "%%N" "!var!%%~xN"
) else (
echo File "!var!%%~xN" ^(from %%N^) already exists.
)
)
)
C:\batch\schar>schar
"C:\batch\schar\Test%doc.doc" --> "Test doc.doc"
"C:\batch\schar\Test%doc.pdf" --> "Test doc.pdf"
File "Test doc.pdf" (from C:\batch\schar\Test&doc.pdf) already exists.
"C:\batch\schar\subdir\FILE%here" --> "FILE here"
@indiv
如果有人能够提供一个没有字符限制的批处理解决方案,我会非常惊讶。
好的,我会尝试。
@echo off
setlocal DisableDelayedExpansion
for /f "usebackq delims=" %%N in (`dir /s /b`) do (
set var=%%~nxN
setlocal EnableDelayedExpansion
set "org=!var!"
set "var=!var:&= !"
set "var=!var:%%= !"
if not "!var!"=="!org!" (
if not exist "%%~dpN!var!" (
echo "!org!" --^> "!var!"
ren "!org!" "!var!"
) else (
echo File "!var!" ^(from !org!^) already exists.
)
)
endlocal
)
Test^!doc.xls
中存在问题,其中将插入符号解释为!
的转义字符。当应该有2个空格时,它会产生替换Test doc.xls
。对于像F%ILE%he%re
这样的文件名,ren
命令也存在问题。替换有效,生成F ILE he re
,但重命名不起作用,因为ren
的第一个参数具有未转义的%
。我认为在批处理中转义特殊字符或抑制其评估(如perl中的'
)并没有简单的解决方案。 - indiv我匆忙地拼凑了这个代码,没有测试过,但这段VBScript应该能解决问题。如果需要像文件夹递归替换等高级功能,请告诉我。
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Your folder here
objStartFolder = "X:\MYFOLDER"
Set objFolder = objFSO.GetFolder(objStartFolder)
Set regEx = New RegExp
'Your pattern here
regEx.Pattern = "[&%]"
Set colFiles = objFolder.Files
For Each objFile in colFiles
objFile.Rename(regEx.Replace(objFile.Name, "")
Next