[Batch/CMD] Массовое переименование файлов/ папок по списку

нужен bat скрипт, который переименовывал бы менял расширения в текущей папке и всех подпапках. То есть, он должен искать файл с определенным расширением, и присваивать ей другое определенное расширение файла.
Вот пример bat-скрипта, который переименовывает файлы с определенным расширением в текущей папке и всех подпапках:

Код:
@echo off
setlocal enabledelayedexpansion

set "old_ext=.txt"  REM Укажите старое расширение файла
set "new_ext=.docx" REM Укажите новое расширение файла

for /r %%i in (*%old_ext%) do (
    set "file=%%i"
    set "new_file=!file:%old_ext%=%new_ext%!"

    ren "!file!" "!new_file!"
)

echo Файлы с расширением %old_ext% переименованы в файлы с расширением %new_ext%.

В этом скрипте переменные old_ext и new_ext определяют старое и новое расширения файлов соответственно. Скрипт будет искать файлы с указанным старым расширением в текущей папке и всех подпапках, и заменять их на новое расширение.

Сохраните этот скрипт в текстовом файле с расширением .bat в нужной вам папке, запустите его, и он должен переименовать файлы с указанным расширением. Пожалуйста, убедитесь, что указываете правильные старое и новое расширения файлов в скрипте перед запуском.
 
Не работает, пробовал запускать просто и от имени админисратора, ничего не переименовано.
 
Не работает, пробовал запускать просто и от имени админисратора, ничего не переименовано.
Давайте попробуем уточнить скрипт для более надежной работы. Вот обновленный bat-скрипт, который должен более точно переименовывать файлы с определенным расширением в текущей папке и всех подпапках:

Код:
@echo off
setlocal enabledelayedexpansion

set "old_ext=.txt"  REM Укажите старое расширение файла
set "new_ext=.docx" REM Укажите новое расширение файла

for /r %%i in (*%old_ext%) do (
    set "file=%%~fi"
    set "new_file=!file:%old_ext%=%new_ext%!"

    ren "!file!" "!new_file!"
)

echo Файлы с расширением %old_ext% переименованы в файлы с расширением %new_ext%.

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

Сохраните этот скрипт в текстовом файле с расширением .bat в нужной вам папке, укажите старое и новое расширения файлов, запустите его и проверьте, переименовались ли файлы. Пожалуйста, дайте знать, если у вас возникнут какие-либо дополнительные проблемы.
 
Не работает. Все файлы остались со старыми расширениями.
Давайте попробуем другой подход. Вместо использования bat-скрипта, можно воспользоваться PowerShell скриптом для переименования файлов с определенным расширением в текущей папке и всех подпапках. Вот пример PowerShell скрипта, который может помочь вам:

PowerShell:
$oldExt = ".txt"  # Укажите старое расширение файла
$newExt = ".docx" # Укажите новое расширение файла

Get-ChildItem -Recurse -Filter "*$oldExt" | ForEach-Object {
    $newName = $_.Name -replace [regex]::Escape($oldExt), $newExt
    Rename-Item -Path $_.FullName -NewName $newName
}

Write-Host "Файлы с расширением $oldExt переименованы в файлы с расширением $newExt."

Сохраните этот скрипт в файле с расширением .ps1. Затем откройте PowerShell, перейдите в папку с вашими файлами и запустите скрипт. Он должен переименовать файлы с указанным старым расширением в новые файлы с указанным новым расширением.

Если у вас возникнут проблемы или вопросы при использовании этого PowerShell скрипта, пожалуйста, дайте знать.
 
Вот рабочий скрипт:
@echo off
set "sdir=c:\Ваша папка\"

for /d /r "%sdir%" %%d in (*) do (
pushd "%%d"
For /r %%i In (".старое") do ren "%%i" ".новое"
popd
)
Прописывайте свой путь и свои расширения, все работает.
 
Последнее редактирование:
Вот рабочий скрипт:
@echo off
set "sdir=c:\Ваша папка\"

for /d /r "%sdir%" %%d in (*) do (
pushd "%%d"
For /r %%i In (".старое") do ren "%%i" ".новое"
popd
)
Прописывайте свой путь и свои расширения, все работает.
Спасибо за предоставленный рабочий скрипт! Этот bat-скрипт будет рекурсивно переименовывать файлы с определенным расширением в текущей папке и всех подпапках. Пользователям, которые столкнутся с подобной задачей, можно использовать этот скрипт, указав свои пути и расширения файлов для переименования.

Если у вас возникнут другие вопросы или задачи, не стесняйтесь обращаться. Я здесь, чтобы помочь!
 
При нажатии на кнопку "ответить" в моем скрипте изчезают символы "*" в скрипте. Запишу эти символы словами, Вы естественно ставте вместо слов символы.

@echo off
set "sdir=c:\Ваша папка\"

for /d /r "%sdir%" %%d in (*) do (
pushd "%%d"
For /r %%i In ("звезда.старое") do ren "%%i" "звезда.новое"
popd
)
 
Маленькое уточнение. Этот БАТ переименовывает файлы во всех подпапках, в текущей папке файлы остаются прежними.
Пример:
set "sdir=c:\Ваша папка\ - в данном случае переименуются файлы во всех подпапках, в папке c:\Ваша папка\" переименования не будет.
 
Маленькое уточнение. Этот БАТ переименовывает файлы во всех подпапках, в текущей папке файлы остаются прежними.
Пример:
set "sdir=c:\Ваша папка\ - в данном случае переименуются файлы во всех подпапках, в папке c:\Ваша папка\" переименования не будет.
Понял, спасибо за уточнение. Если вам нужно переименовать файлы только в подпапках, но не в текущей папке, вот обновленная версия bat-скрипта:

Код:
@echo off
set "sdir=c:\Ваша папка\"

for /d /r "%sdir%" %%d in (*) do (
    pushd "%%d"
    For /r %%i In ("*.старое") do ren "%%i" "*.новое"
    popd
)

Этот скрипт будет рекурсивно переименовывать файлы с указанным старым расширением только в подпапках, но не в текущей папке. Укажите свой путь и соответствующие расширения файлов для переименования. Пожалуйста, попробуйте этот скрипт и дайте знать, если у вас возникнут какие-либо вопросы.
 
Последнее редактирование модератором:
Помогите со скриптом.
Есть файл(ы) с одинаковым расширением, но абсолютно произвольным именем. Файл обрабатывается консольной программой, где на выходе имеем файл с другим расширением. Нужно присвоить первоначальное имя выходному файлу и положить в эту же папку где брали файл(ы).
 
Помогите со скриптом.
Есть файл(ы) с одинаковым расширением, но абсолютно произвольным именем. Файл обрабатывается консольной программой, где на выходе имеем файл с другим расширением. Нужно присвоить первоначальное имя выходному файлу и положить в эту же папку где брали файл(ы).
Для автоматизации этого процесса можно написать скрипт на языке PowerShell. Вот пример скрипта, который будет обрабатывать файлы с произвольными именами и расширениями, заменять их на выходной файл с другим расширением и сохранять его с исходным именем в той же папке:

PowerShell:
# Укажите путь к папке с файлами
$folderPath = "путь_к_папке"

# Укажите путь к консольной программе для обработки файлов
$consoleProgram = "путь_к_программе"

# Укажите расширение входных файлов
$sourceExtension = ".входное_расширение"

# Укажите расширение выходных файлов
$targetExtension = ".выходное_расширение"

# Получаем список входных файлов
$files = Get-ChildItem -Path $folderPath -Filter *$sourceExtension

# Обрабатываем каждый файл
foreach ($file in $files) {
    # Получаем путь к выходному файлу с новым расширением
    $outputFile = [System.IO.Path]::ChangeExtension($file.FullName, $targetExtension)

    # Запускаем консольную программу для обработки файла
    & $consoleProgram $file.FullName $outputFile

    # Переименовываем выходной файл в исходное имя файла
    Rename-Item -Path $outputFile -NewName $file.Name
}

Прежде чем использовать этот скрипт, убедитесь, что у вас установлен PowerShell. Замените "путькпапке", "путькпрограмме", "входноерасширение" и "выходноерасширение" на соответствующие значения для вашего случая. Запустите скрипт, и он обработает файлы в указанной папке, сохраняя выходные файлы с исходными именами и расположением.
 
Это все не то. Сделать нужно в cmd. Расширения входных и выходных файлов известны. Неизвестны только имена, они всегда разные. Алгоритм такой. Берем файл, запоминаем его имя(сохраняем в переменную), переименовываем его для вызова консольной программы, на выходе получаем файл с другим именем и другим расширением(оно известно я могу указать вручную). Теперь нужно переименовать из запомненного(сохраненное в переменную) входной и выходной файлы.
 
Это все не то. Сделать нужно в cmd. Расширения входных и выходных файлов известны. Неизвестны только имена, они всегда разные. Алгоритм такой. Берем файл, запоминаем его имя(сохраняем в переменную), переименовываем его для вызова консольной программы, на выходе получаем файл с другим именем и другим расширением(оно известно я могу указать вручную). Теперь нужно переименовать из запомненного(сохраненное в переменную) входной и выходной файлы.
Понял вас. Вот скрипт на cmd, который может помочь вам выполнить описанный алгоритм:

Код:
@echo off
setlocal enabledelayedexpansion

set "sdir=путь_к_папке"
set "consoleProgram=путь_к_консольной_программе"
set "inputExtension=входное_расширение"
set "outputExtension=выходное_расширение"

for %%F in ("%sdir%\*%inputExtension%") do (
    set "inputFile=%%~nxF"
    set "outputFile=!inputFile:%inputExtension%=%outputExtension%!"

    ren "%%F" "!outputFile!.tmp"
    call :runConsoleProgram "!outputFile!.tmp" "!outputFile!"
    ren "!outputFile!.tmp" "!inputFile!"
)

exit /b

:runConsoleProgram
%consoleProgram% %1 %2
exit /b

Прежде чем запустить этот скрипт, замените "путькпапке", "путькконсольнойпрограмме", "входноерасширение" и "выходное_расширение" на соответствующие значения для вашего случая. Этот скрипт будет выполнять указанный алгоритм: переименовывать входные файлы для обработки консольной программой, затем переименовывать выходные файлы обратно к исходным именам. Пожалуйста, попробуйте этот скрипт и дайте знать, если у вас возникнут какие-либо вопросы.
 
Попробовал и не получилось. Потому что консольная программа имеет свой синтаксис. Нужно прописывать ключи для ее работы. Попробуем упростить задачу. Покажите мне в статике без цикла, для одного файла как записать в переменную имя файла? Итак в папке где находится файл с абсолютно любым именем и расширением txt (*.txt) записываем имя файла в переменную, переименовываем файл в in.txt. Далее вызываем консольную программу по синтаксису путь к программе in.txt ключ out. После обработки файла in.txt консольная программа создает файл с именем out.txt1. То есть файл с именем которое вы конкретно указали и расширенеим txt1. Переименовываем in.txt и out.txt1, берем из переменной имя файла. Если это возможно, покажите как это будет в цикле. Спасибо.
 
Попробовал и не получилось. Потому что консольная программа имеет свой синтаксис. Нужно прописывать ключи для ее работы. Попробуем упростить задачу. Покажите мне в статике без цикла, для одного файла как записать в переменную имя файла? Итак в папке где находится файл с абсолютно любым именем и расширением txt (*.txt) записываем имя файла в переменную, переименовываем файл в in.txt. Далее вызываем консольную программу по синтаксису путь к программе in.txt ключ out. После обработки файла in.txt консольная программа создает файл с именем out.txt1. То есть файл с именем которое вы конкретно указали и расширенеим txt1. Переименовываем in.txt и out.txt1, берем из переменной имя файла. Если это возможно, покажите как это будет в цикле. Спасибо.
Вот пример скрипта на cmd, который реализует ваше описание для одного файла без цикла:

Код:
@echo off

set "fileName="
for %%F in (*.txt) do set "fileName=%%~nF"

ren "%fileName%.txt" "in.txt"
call :runConsoleProgram "in.txt" "out.txt1"
ren "in.txt" "%fileName%.txt"
ren "out.txt1" "%fileName%1.txt"

exit /b

:runConsoleProgram
консольная_программа %1 ключ %2
exit /b

Прежде чем запустить скрипт, замените "консольная_программа" на путь к вашей консольной программе и укажите необходимые ключи для ее работы. Этот скрипт берет файл с расширением .txt, сохраняет его имя в переменную, переименовывает его в in.txt, вызывает консольную программу с указанным синтаксисом, переименовывает файлы обратно с использованием имени файла из переменной. Пожалуйста, попробуйте этот скрипт и дайте знать, если у вас возникнут какие-либо вопросы.
 
Вот правильный и рабочий скрипт

@echo off
title program

set "fileName="
for %%F in (*.txt) do set "fileName=%%~nF"

ren "%fileName%.txt" "in.txt"
call :runConsoleProgram "in.txt" "out"
ren "in.txt" "%fileName%.txt"
ren "out.txt1" "%fileName%.txt1"
pause
exit /b
:runConsoleProgram
путь к консольной программе %1 ключ %2
exit /b
 
Вот правильный и рабочий скрипт

@echo off
title program

set "fileName="
for %%F in (*.txt) do set "fileName=%%~nF"

ren "%fileName%.txt" "in.txt"
call :runConsoleProgram "in.txt" "out"
ren "in.txt" "%fileName%.txt"
ren "out.txt1" "%fileName%.txt1"
pause
exit /b
:runConsoleProgram
путь к консольной программе %1 ключ %2
exit /b
Хорошо, рад, что у вас получилось справиться с задачей! Если у вас возникнут еще вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться. Удачи вам!
 
Назад
Сверху Снизу