用于从文件名中删除特殊字符的脚本

时间:2010-12-13 14:07:28

标签: batch-file

我有一个包含大量文件的文件夹。很多文件名都有'%'和/或'&'他们中的人物。

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

我可以快速删除'%'和'&'使用Windows批处理文件,vbscript或类似的字符?

非常感谢所有帮助。

感谢。

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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
)

诀窍是,切换延迟扩展,因为扩展for-loop-vars(%% N)应该在没有延迟扩展的情况下完成,否则你会丢失惊叹号,并且出现了插入问题。 但是要处理和修改字符串,你应该使用延迟扩展。

但为什么呢?答案是了解批处理解析器的各个阶段。

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

答案 2 :(得分: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