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

У меня есть код только для изменения файла или папки, а не оба

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET old=newdocV9
SET new=newdocV10
for /f "tokens=*" %%f in ('dir /b *.*') do (
  SET newname=%%f
  SET newname=!newname:%old%=%new%!
  move "%%f" "!newname!"
)

Я ищу код для переименования файлов и папок одновременно, используя пакетный скрипт

3 ответа3

0

код не работает для меня @echo от SETLOCAL enableextensions enabledelayedexpansion SET "старый = newdocV9" SET "новый = newdocV10" для / ф "токенов = *" %% е в ('реж / б% старого%. *) у (SET "newname = %% ~ f" SET "newname =!новое_имя:% старое% =% новый%!" Если я "!новое имя!"==" %% ~ f "(echo ====" %% ~ f ") else (перемещение эха" %% ~ f ""!новое имя!")) ENDLOCAL goto:eof


У меня есть папка

/b -----(Внутри этой папки)----/doc10(подпапка)------- Внутри этого --- 1.txt, 2.tx .....

Я хочу переименовать все файлы одновременно

0

Dbenham прав, ваш существующий опубликованный код должен переименовывать как файлы, так и папки. Единственная сомнительная точка лежит здесь: move folder folder с тем же источником и цель может привести к контрольной точке с процессом не может получить The process cannot access the file because it is being used by another process , так как он используется другим сообщением об ошибке процесса (см примера выпуска продукции ниже). Просто, if /I мог бы решить это следующим образом:

@echo off
SETLOCAL enableextensions enabledelayedexpansion
SET "old=ACK"
SET "new=XYZ"
for /f "tokens=*" %%f in ('dir /b *%old%*.*') do (
  SET "newname=%%~f"
  SET "newname=!newname:%old%=%new%!"
  if /I "!newname!"=="%%~f" (
        echo ==== "%%~f"
    ) else (
        echo move "%%~f" "!newname!"
    )
)
ENDLOCAL
goto :eof

Выход:

==>D:\bat\SuperUser\881861.bat
move "ACKnowledge" "XYZnowledge"
move "assocbackup.txt" "assocbXYZup.txt"
move "ftypebackup.txt" "ftypebXYZup.txt"
move "StackOverflow" "StXYZOverflow"

==>move "ftypebackup.txt" "ftypebackup.txt"
        1 file(s) moved.

==>move "StackOverflow" "StackOverflow"
The process cannot access the file because it is being used by another process.

==>
-1

Проблема в том, что команда SET не работает при использовании внутри () разделов.

Чтобы преодолеть эту проблему, вы можете создать 2-й пакетный файл и поместить туда все команды, а затем обратиться к этому пакетному файлу из команды FOR .

Ваш второй пакетный файл будет выглядеть примерно так:

::dorename.cmd
SET old=newdocV9
SET new=newdocV10

SET newname=%1
SET newname=!newname:%old%=%new%!
move "%%f" "!newname!"

Ваша команда for будет выглядеть примерно так:

for /f "tokens=*" %%f in ('dir /b *.*') do dorename %%f

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .