вы можете достичь поставленной цели только в том случае, если в каждой папке никогда не будет более одного файла заданного типа. Это не разумные ожидания, если нет необычных обстоятельств.
но перед каждым файлом можно вставить имя родительской папки-что-то вроде
"fileName.ext" --> "parentFolderName_fileName.ext"
FOR /R
команда может перебирать пути к папкам всех папок в корневом дереве.
DIR /B /A-D "folderPath"
команда может перечислить все файлы внутри папки. Но вы не хотите переименовывать файлы, которые начинаются с имени родительской папки, чтобы их можно было передать в FINDSTR для исключения уже переименованных файлов.
результаты передаваемой по конвейеру команды можно повторить с помощью 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.ЛЕТУЧАЯ МЫШЬ утилита переименования регулярных выражений. Это чистый скрипт (hybrid batch / JScript), который изначально работает на любой машине Windows, начиная с XP. Нет 3rd party exe файлы не нужны.
полная документация встроена в утилиту-Access via jren /?
или jren /??
если вы хотите постраничный вывод.
следующая простая команда обработает дерево, коренящееся в текущем каталоге:
for /r %F in (.) do @call jren "^" "%~nxF_" /p "%F" /fx "%~nxF_*"
первые два аргумента JREN являются find / replace строки-поиск соответствует началу имени файла, а замена просто вставляет имя родительской папки (с конечным подчеркиванием). The /P "%F"
параметр указывает корневую папку. А то /FX "%~nxF_*
опция исключает файлы, которые уже начинаются с имени родительской папки, с последующим подчеркиванием.
команда может быть помещена в пакетный скрипт, который принимает необязательную корневую папку в качестве аргумента (обработать текущий каталог, если значение не указано):
@echo off
for /r %1 %%F in (.) do call jren "^" "%%~nxF_" /p "%%F" /fx "%%~nxF_*"