2009-10-23 2 views
3

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

Пример:

процесс/MyDirectory/Ola и Me/Private/TopSecretPictures/

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

процесс/MyDirectory/Ola и Me/Частным лицам/TopSecretPictures

Моя цель: преобразование | Ола и Me | >> | Ola_And_Me рекурсивно

:)

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

+0

вы пробовали «процесс»/MyDirectory/Obama и Me/Private/TopSecretPictures/«'? – Etan

+0

Для новых стандартов именования отдела я должен изменить все имена каталогов – Yaya

ответ

6

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

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» не будет переименован.

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

2

Вы можете сделать это в пакетном файле, если вы используете функцию под названием «задержка exapansion», что не по умолчанию. Для того, чтобы включить его, вам нужно начать с 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 ... *** за исключением для самого цикла, интересные части этого являются:

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

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

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

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

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

Смежные вопросы