как заменить имена рекурсивно через пакетную операцию Windows - PullRequest
3 голосов
/ 23 октября 2009

Я хочу обработать пакетную операцию в большом каталоге. На самом деле у меня есть пакетный скрипт для этого процесса. Но здесь у меня проблема. Некоторые из имен каталогов, имена файлов содержат "" (пробел). Таким образом, в пакетной операции эти имена передаются как 2 аргумента. и эти строки не будут работать. Поэтому я хочу переименовать "" с "_", чтобы преодолеть эту проблему.

Пример:

process / MyDirectory / Ola and Me / Приватный / TopSecretPictures /

это дает ошибку. ниже работает нормально

process / MyDirectory / Ola and Me / Личное / TopSecretPictures

Моя цель: конвертировать | Ола и Я | >> | Ola_And_Me рекурсивно

:)

спасибо заранее ..

Ответы [ 2 ]

6 голосов
/ 24 октября 2009

Следующий скрипт рекурсивно переименовывает все файлы и каталоги, начиная с заданного каталога, преобразуя пробелы в подчеркивания.

spaces_to_underscores.bat источник:

@echo off
setlocal

for /r "%~1" %%t in (.) do (
   for /f "usebackq tokens=*" %%f in (`dir /b/a-d "%%~t" 2^>nul:`) do (
      call :proc "%%~f" "%%~t"
   )
   for /f "usebackq tokens=*" %%d in (`dir /b/ad "%%~t" 2^>nul:`) do (
      call :proc "%%~d" "%%~t"
   )
)
exit /b 0

:proc
   set fn=%~1
   if "%fn: =_%"=="%fn%" exit /b 0
   set fn=%~2\%fn: =_%
   move "%~2\%~1" "%fn%" >nul:
exit /b 0

Использование:

spaces_to_underscores "My Directory"

Учитывая эту структуру каталогов

My Directory
    Ola and Me
        Private
            TopSecretPictures

будет переименовывать папку "Ola and Me" в "Ola_and_Me", а также переименовывать любые файлы, такие как "Photo 001.jpg", в "Photo_001.jpg". Начальный каталог "My Directory" не будет переименован.

ПРЕДУПРЕЖДЕНИЕ: Не запускайте этот сценарий в стандартных каталогах Windows, таких как «C:\Documents and Settings» или «C:\Program Files» или «My Documents» или «Application Data». Здесь нет функции отмены. Убедитесь, что у вас есть резервная копия.

2 голосов
/ 23 октября 2009

Вы можете сделать это в пакетном файле, если вы используете функцию, называемую «отсроченным расширением», которая не включена по умолчанию. Чтобы включить его, нужно запустить cmd.exe с ключом / v:

cmd.exe /v

Когда эта функция включена, следующий пакетный скрипт заменит все пробелы в %% i символами подчеркивания и выдаст результат:

for /f "usebackq tokens=*" %%i in (`dir /b`) do (
    set S=%%i
    set T=!S: =_!
    echo !T!
)

*** Описание Vauge ... *** За исключением самого цикла for, интересными частями этого являются:

  • Подстановка строк с использованием синтаксиса %var:str1=str2%
  • Задержка расширения с использованием !var! вместо %var%

Во-первых: отложенное расширение ... без этого интерпретатор команд (по какой-либо причине Microsoft решила закодировать его как) сначала оценит все параметры, а затем запустит скрипт: так что эта версия скрипта делает НЕ работает :

for /f "usebackq tokens=*" %%i in (`dir /b`) do (
    set S=%%i
    set T=%S: =_%
    echo %T%
)

В этой версии переменная 'T' устанавливается на последнее значение цикла for до того, как содержимое блока (...) будет фактически выполнено. Что не имеет смысла для меня. Таким образом, с включенным отложенным выполнением мы можем использовать метки переменных отложенного выполнения, то есть! Var! а не% var%. Что дает нам правильный результат.

Другой умный бит - это set T=!S: =_! (который в основном говорит, что устанавливает T в S, заменяя каждое '' 'в S на' _ '). Без отложенного расширения это будет написано set T=%S: =_%.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...