Хорошо, сценаристы,

Я все еще пытаюсь обернуться вокруг команды FOR. Что я хотел бы сделать, так это переименовать все файлы во всех подпапках в имя папки, в которой они находятся, сохранив их расширения. Я полагаю, что это можно сделать с помощью чего-то вроде:

   For /R %X in (*.*) do REN %X <argument for parent folder name>

Возможно я не прав. Какой правильный способ сделать это? И это должен быть сценарий. Я не спрашиваю о программе Bulk Rename Utility, File Renamer Deluxe и т.д.

Спасибо за ваше время!

2 ответа2

1

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

Но перед каждым файлом можно вставить имя родительской папки - что-то вроде
"fileName.ext" --> "parentFolderName_fileName.ext"

Команда FOR /R может повторять пути к папкам всех папок в корневом дереве.

Команда DIR /B /A-D "folderPath" может перечислить все файлы в папке. Но вы не хотите переименовывать файлы, которые уже начинаются с имени родительской папки, поэтому их можно отправить в FINDSTR, чтобы исключить уже переименованные файлы.

Результаты команды piped могут быть повторены с FOR /F. Параметры EOL и DELIMS используются для обеспечения сохранения полного имени каждого файла.

%%~nxD возвращает только имя папки и расширение родительской папки.

Собрав все это вместе, следующий длинный вкладыш можно использовать непосредственно в командной строке. Это обработает дерево с корнем в текущем каталоге.

for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /b /a-d "%D" 2^>nul^|findstr /vbic:"%~nxD_"') do ren "%D\%F" "%~nxD_%F"

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

@for /r %1 %%D in (.) do @for /f "eol=: delims=" %%F in (
  'dir /b /a-d "%%D" 2^>nul^|findstr /vbic:"%%~nxD_"'
) do ren "%%D\%%F" "%%~nxD_%%F"

Код проще, если вы используете мою утилиту переименования регулярных выражений JREN.BAT. Это чистый скрипт (гибридный пакет /JScript), который работает на любом компьютере с Windows начиная с XP. Не требуются сторонние exe-файлы.

Полная документация встроена в утилиту, доступ к которой осуществляется через jren /? или jren /?? если вы хотите постраничный вывод.

Следующая простая команда обработает дерево с корнем в текущем каталоге:

for /r %F in (.) do @call jren "^" "%~nxF_" /p "%F" /fx "%~nxF_*"

Первые два аргумента JREN - это строки поиска / замены - поиск соответствует началу имени файла, а замена просто вставляет имя родительской папки (с завершающим подчеркиванием). Параметр /P "%F" указывает корневую папку. А параметр /FX "%~nxF_* исключает файлы, которые уже начинаются с имени родительской папки, за которым следует подчеркивание.

Команду можно поместить в пакетный скрипт, который принимает необязательную корневую папку в качестве аргумента (обрабатывает текущий каталог, если не указано значение):

@echo off
for /r %1 %%F in (.) do call jren "^" "%%~nxF_" /p "%%F" /fx "%%~nxF_*"
0

Сохранить как *.bat

@echo off
for /r %%D in (.) do (
  for /f "delims=" %%F in ('dir /b /A:-D "%%D"') do echo "%%D\%%F" "%%~nxD%%~xF"
)
@echo off
for /r %%F in (*) do (
  for /f "delims=" %%D in ("%%~dpF.") do echo "%%F" "%%~nxD%%~xF"
)

Убедитесь, что это именно то, что вам нужно, прежде чем заменять echo на ren .

Рекомендации:
Для - циклические команды
Расширения параметров

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