5

Используя приведенный ниже код, я добавляю текст в конец имен файлов:

1.mp3
2.mp3

и должно быть:

1text.mp3
2text.mp3

но он изменился на:

1.mp3text
2.mp3text

Код:

@ECHO ON

FOR %%A IN ("C:\Users\user123\Desktop\mp3\*.mp2") DO (
    CALL :RenameFiles "%%~A" "%%~NXA"
)
GOTO EOF

:RenameFiles

SET fname=%~2
SET renname=%fname=%
REN "%~1" "%renname%text%"
GOTO E

3 ответа3

6

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

ren "C:\Users\user123\Desktop\mp3\*.mp3" ??????????????????????text.*

? жадно совпадает и сохраняет любой символ, кроме . и может ничего не совпадать, если в нем нет символов. Ваш текст затем добавляется, а затем .* Соответствует и сохраняет точку и оставшуюся часть имени.

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

См. Как команда Windows RENAME интерпретирует подстановочные знаки? для дополнительной информации.

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

@echo off
pushd "C:\Users\user123\Desktop\mp3\*.mp3"
for /f "delims= eol=:" %%F in ('dir /b /a-d *.mp3') do ren "%%F" "%%~nFtext%%~xF"
popd

Обратите внимание, что важно использовать FOR /F, а не простой FOR. FOR /F собирает весь результат команды DIR перед началом итерации, тогда как простой FOR начинает выполнять итерацию после заполнения внутреннего буфера, что повышает риск переименования одного и того же файла несколько раз.

Я использую EOL=: для защиты от удаленной возможности, с которой начинается имя файла ; , EOL по умолчанию является ; , который игнорирует строки, начинающиеся с ; , Имена файлов не могут содержать : поэтому для параметра EOL это безопасный символ.

Один небольшой недостаток FOR /F с DIR /B - это то, что он не сохраняет информацию о пути, поэтому я использовал PUSHD в начале. Без PUSHD вы могли бы включить информацию о пути в команду DIR, но тогда вам также нужно будет включить путь в маску источника REN. Следующая строка работает в командной строке (без пакетного скрипта):

for /f "delims= eol=:" %F in ('dir /b /a-d "C:\Users\user123\Desktop\mp3\*.mp3"') do @ren "C:\Users\user123\Desktop\mp3\%F" "%~nFtext%~xF"

Альтернативой является использование команды FINDSTR для вывода списка файлов, который удобно сохраняет информацию о пути:

for /f "delims=" %F in ('findstr /m "^" "C:\Users\user123\Desktop\mp3\*.mp3"') do @ren "%F" "%~nFtext%~xF"

Поскольку каждый указанный файл начинается с буквы диска, можно использовать EOL=; по умолчанию ; ,

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

jren "(.*)(\.mp3)$" "$1text$2" /i /p "C:\Users\user123\Desktop\mp3"

Поскольку JREN является пакетным скриптом, вам нужно будет использовать CALL JREN, если вы используете команду в другом пакетном скрипте.

3

Как мне добавить "текст" в конце нескольких имен файлов.

До: 1.mp3 2.mp3

После: 1text.mp3 2text.mp3

В вашем командном файле есть несколько ошибок, например:

  • *.mp2 должен быть *.mp3
  • goto E - метка :E отсутствует.
  • Вам не нужно ничего call .

Простой рабочий пакетный файл

rem @echo off
setlocal
setlocal enabledelayedexpansion
for %%a in ("C:\Users\user123\Desktop\mp3\*.mp3") do (
    copy "%%a" "%%~dpnatext%%~xa"
    del "%%a" 
)
endlocal

Заметки:

  • Пакетный файл будет работать с именем файла любой длины, поэтому, например, 12345.mp3 будет переименован в 12345text.mp3

решение оболочки cmd

Вам не нужно использовать командный файл. Вы можете просто использовать:

cd C:\Users\user123\Desktop\mp3\
ren ?.mp3 ?text.mp3

Или же:

ren *.mp3 ?text.mp3

Обратите внимание, что следующее не работает:

ren *.mp3 *text.mp3

Вы получите имена файлов, такие как 1.mp3text.mp3 с этой командой.

Пример:

F:\test>dir *.mp3
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

29/11/2015  12:52                 0 1.mp3
29/11/2015  12:52                 0 2.mp3
               2 File(s)              0 bytes
               0 Dir(s)  1,777,665,769,472 bytes free

F:\test>ren ?.mp3 ?text.mp3

F:\test>dir *.mp3
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

29/11/2015  12:52                 0 1text.mp3
29/11/2015  12:52                 0 2text.mp3
               2 File(s)              0 bytes
               0 Dir(s)  1,777,665,769,472 bytes free

Дальнейшее чтение

0

Это должно быть сделано в командном файле? AdvancedRenamer - бесплатная и очень универсальная программа для переименования файлов или папок в пакетном режиме. Легко решает вашу проблему.

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