Переименование файлов во вложенных папках

#batch-file

#пакетный файл

Вопрос:

 @echo off
for /r /d  /s %%d in (*.*) do (    
    if exist "%%d(1).txt" ( 
        rename "%%d(1).txt" "%%d(-123).txt"
    )
)
 

Когда я тестирую это, ничего не происходит. Чего мне не хватает в этом?

Я отредактировал это несколькими разными способами, я не могу заставить это работать.

С /s , без него, с if exist , и без, с (*.txt) , ничего, мне на самом деле не нужно if exist , но просто тестирую его.

К чему я стремлюсь, так это: Main FolderfolderSub Folders

Внутри вложенной папки у меня может быть от 80 до 150 текстовых файлов с такими именами (1).txt (2).txt и т.д. И я пытаюсь заставить этот пакетный файл найти все (1).txt в каждой вложенной папке и переименовать его в (-123.txt) , и найти все (2).txt и переименовать их в (-121).txt , вплоть до xx.txt файлов с номерами.

Поскольку у меня нет более простого способа переименования этих файлов, мне пришлось бы повторять этот сценарий много раз в одном и том же пакетном файле.

Как только эти скрипты заработают, мне придется сделать много копий и создать очень длинный пакет скриптов. Я знаю, что теперь их скрипт переименует так, как мне нужно, но если он сможет сканировать все папки и вложенные папки из основной папки, это было бы намного лучше

 (1).txt => (-123).txt
(2).txt => (-121).txt
(3).txt => (-119).txt
(4).txt => (-87).txt
(5).txt => (-55).txt
(6).txt => (-110).txt
(7).txt => (-101).txt
 

Прямо сейчас у меня есть это, но я просматриваю папку за папкой.

Переименовать.bat:

 (1).txt => (-123).txt
(2).txt => (-121).txt
(3).txt => (-119).txt
(4).txt => (-87).txt
(5).txt => (-55).txt
(6).txt => (-110).txt
(7).txt => (-101).txt
 

Есть ли способ заставить мои текущие файлы bat читать вложенные папки, поскольку у меня уже есть rename.bat файлы. У меня есть простой базовый ren "(1).txt "(-123).txt", способ, который работает хорошо, но перемещение его в более чем 100-200 папок 1 на 1 занимает много времени

У меня есть, давайте назовем это main.txt папка
и внутри основной папки у меня есть rename.bat,
а внутри основной папки у меня есть рабочая папка,
а внутри рабочей папки у меня есть 100 папок со 100 вложенными
папками. Я пытаюсь заставить свой rename.bat считывать рабочую папку из основной папки
и сканировать каждуюпапка и вложенная папка и поиск каждого соответствующего текстового файла
когда он сканирует, находит и сопоставляет каждый текстовый файл, он переименовывает их

 (1).txt => (-123).txt
(2).txt => (-121).txt
(3).txt => (-119).txt
(4).txt => (-87).txt
(5).txt => (-55).txt
(6).txt => (-110).txt
(7).txt => (-101).txt
 

Прямо сейчас я копирую каждую папку 1 на 1 и помещаю их в main.txt папку
и дважды щелкните переименовать .bat, и это займет целую вечность

и я также копирую файл rename.bat в папки, в которых находятся файлы, и дважды щелкаю по нему там

У меня более 100 папок, так что это длится вечно

Комментарии:

1. Здравствуйте. 123-2=121-2=119-2=117? откуда взялся (87)? Пожалуйста, объясните, чтобы мы могли помочь.

2. @Toni числовые числа переименовываются в — unnumerical order и не являются полными, поэтому они не будут учитываться от 123 до 1, вот как это выглядит 1 = -123, и 10 = -45, и 50 = -78, как вы можете видеть, я переименовываю их так, минус важен, ичисло важно для моего заказа, и как я сопоставляю их с числовыми числами, поэтому я знаю, что использование стандартных инструментов подсчета не сработает, что для этого нужно оштрафовать все папки с помощью (1).txt и переименовать их все в (-123).txt и так далее

3. Если я правильно понимаю вашу задачу, оставьте Rename.bat ее нетронутой и в том же месте, что и другой ваш пакетный файл, который также должен быть корневым каталогом дерева, которое вы пытаетесь выполнить итерацию. Тогда ваш пакетный файл может выглядеть следующим образом: @For /F "EOL=? Delims=" %%G In ('Dir /B /S /A:D') Do @PushD "%%G" amp;amp; (Call "%~dp0Rename.bat" >NUL 2>amp;1 amp; PopD) .

4. @Compo Спасибо, но у меня много вложенных папок, это вызовет файл rename.bat, но мне пришлось бы поместить файл rename.bat во многие папки, моя цель здесь — прочитать как можно больше папок и вложенных папок из основной папки, используя 1 renamer.bat

5. Я исправлю свои вопросы, мой первоначальный вопрос был отредактирован

Ответ №1:

Если я правильно понимаю вашу задачу, оставьте Rename.bat ее нетронутой и в том же месте, что и пакетный файл, который я опубликовал ниже, который также должен быть корневым каталогом дерева, которое вы пытаетесь выполнить итерацию. Итак, если бы все файлы находились в каталогах и подкаталогах ниже C:UsersJavierDesktop , у вас был бы Rename.bat и этот новый пакетный файл C:UsersJavierDesktop , тогда просто дважды щелкните по вашему новому пакетному файлу!

 @For /F "EOL=? Delims=" %%G In ('Dir /B /S /A:D') Do @PushD "%%G" amp;amp; (Call "%~dp0Rename.bat" >NUL 2>amp;1 amp; PopD)
 

Комментарии:

1. Это отлично сработало для всех, кто использует это, просто измените Rename.bat на свое собственное имя bat, большое вам спасибо

2. Привет, у меня есть 1 вопрос, прошлой ночью, когда я продолжал возиться со своим оригинальным вопросом сценария, о том, как я смог переименовать все (1) .txt файлы в foldername(-123).txt, он каким-то образом захватил имя папки, у вас есть идея, как я это сделал, когда я собирался проверить ваш ответ, я увидел, что все мои (1).txt были переименованы, теперь я пытаюсь это выяснить, потому что одному из моих проектов нужно что-то подобное. просто вопрос, если вы скажете мне, что с этим скриптом что-то подобное невозможно, тогда я посмотрю, что я сделал, но я знаю, что я возился со сценарием, о котором я спрашиваю

Ответ №2:

Вы можете попробовать:

 setlocal enabledelayedexpansion

set /a "numfiles=20"

for /f "tokens=* delims=" %%a in ('dir /b /s "C:pathtoyourfolder"') do (
    set "pt=%%~dpa"
    set "pt=!pt:~0,-1!"

    set "opts=tokens=* delims="
    for /l %%i in (1,1,!numfiles!) do (
        if exist "!pt!(%%i).txt" (
            call:getrenamestring "!opts!" renamestring
            move /y "!pt!(%%i).txt" "!pt!(!renamestring!).txt"
        )
        set "opts=tokens=* skip=%%i delims="
    )
)
goto:end



:getrenamestring
set "optstmp=%~1"
for /f "usebackq %optstmp%" %%s in ("file where you store the renaming patterns IN ROW ORDER.txt") do (
    set "%2=%%s"
    exit /b 0
)
exit /b 0


:end
endlocal
exit /b 0