2010-12-13 104 views
4

我有一个包含大量文件的文件夹。很多文件名中都有'%'和/或'&'字符。从文件名中删除特殊字符的脚本

e.g. Test&doc.pdf 
e.g Test%doc.doc 

是否有一个快速的方法我可以删除“%”,并使用Windows批处理文件,VBScript或类似的东西“&”字?

所有帮助将不胜感激。

感谢。

+0

为什么一个批处理文件? – CodesInChaos 2010-12-13 14:29:06

+0

该文件夹位于我无权访问的远程服务器上。所以我想给那些可以运行一次脚本的人。 – 2010-12-13 14:31:06

+0

我想它不一定是批处理文件。它可能是一个VBScript或类似的东西。我会更新问题。 – 2010-12-13 15:51:38

回答

2

我已经很快把它们扔在一起,并没有测试它,但是这个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 
+0

即将上传我自己的答案,其工作方式相同。谢谢你的帮助! – 2010-12-13 16:20:54

3

这是你如何批量做(如果你好奇)。最大的限制是如果你的文件名的符号超过百分之一,它将无法工作,因为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" 
+0

我测试过它,它也适用于多个百分号,但是它没有使用exclamaton标记和插入符号。 – jeb 2010-12-14 09:05:46

+0

@jeb:感谢您的检查。我越深入研究它,就越意识到这是一个非常难以解决的难题。我只是无法弄清楚如何阻止shell评估字符串中的特殊字符。这个答案有很多限制,我应该删除它。如果有人能够制作出没有任何字符限制的批处理解决方案,我将会受到极大的印象。 – indiv 2010-12-14 18:39:47

+0

我希望,我的解决方案可以无限制地处理所有人物 – jeb 2010-12-15 15:56:55

3

@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 
) 

的诀窍是,切换延迟扩展,因为扩大 - 环 - 瓦尔(%% N)应无延迟扩展来实现,否则就失去了感叹号,并得到了与插入记号的问题。 但要处理和修改字符串,您应该使用延迟扩展。

但是为什么?答案是理解批解析器的阶段。

我试着在这里解释一下。 how-does-the-windows-command-interpreter-cmd-exe-parse-scripts

+0

干得不错,比我的解决方案好。它有一个'Test ^!doc.xls'的问题,它将插入符解释为'!'的转义字符。当应该有2个空格时,它会生成替代'Test doc.xls'。 'ren'命令对于像'F%ILE%he%re'这样的文件名也有问题。替换工作,产生'F ILE he re',但重命名不起作用,因为'ren'的第一个参数已经转义了'%'。我不认为有一个简单的解决方案来批量转义特殊字符,或者像perl中的'''一样压制他们的评估。 – indiv 2010-12-15 16:28:26

+0

F%ILE%he%re的重命名工作,因为与ren“!org!”的扩展是安全的,因为在延迟扩展之后不再进行解析。在我的批处理中,还将“f%test ^!doc.xls”重命名为“f test ^!doc.xls” – jeb 2010-12-15 18:16:40