Скрипт для удаления специальных символов из имен файлов - PullRequest
4 голосов
/ 13 декабря 2010

У меня есть папка, содержащая большое количество файлов. Многие имена файлов содержат символы «%» и / или «&».

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

Можно ли как-нибудь быстро удалить символы '%' и '&', используя пакетный файл Windows, VBScript или что-то подобное?

Любая помощь будет принята с благодарностью.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 13 декабря 2010

Вот как вы можете сделать это в пакетном режиме (если вам интересно).Большим ограничением является то, что если у вас есть имена файлов со знаком более одного процента, он не будет работать, потому что оболочка расширяет его до переменной.Я не знаю сразу, как это исправить.

Он начинается с любого каталога, в котором находится скрипт, и рекурсивно работает со всеми подкаталогами.

@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"
3 голосов
/ 15 декабря 2010

@ индивиду *

Если кто-то может создать пакетное решение без ограничений по количеству персонажей, я буду очень впечатлен.

Хорошо, я попробую.

@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) должно выполняться без отложенного расширения, иначе вы потеряете восклицательные знаки и получите проблемы с каретками.Но для обработки и изменения строк вы должны использовать отложенное расширение.

Но почему?Ответ в том, чтобы понять фазы парсера.

Я попытался объяснить это здесь. как-делает-на-окна-командной интерпретатор-CMD-EXE-синтаксический анализ-скрипты

2 голосов
/ 13 декабря 2010

Я быстро скомбинировал это и не тестировал, но этот 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...