#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