Переименовать (или удалить префикс) несколько файлов на каждый номер

Я пытаюсь изменить все имена файлов в текущей папке, и я пытаюсь достичь этого, либо удалив префикс файлов (каждый файл имеет общий префикс), либо изменив их имена на их количество (если есть 5 файлов, имена файлов будут 1.txt 2.txt 3.txt 4.txt 5.формат txt.)

теперь я нашел команду ren в cmd и немного поиграл с ней, но до сих пор я не смог достичь результата, и я могу запустить это только в cmd, поэтому пакетные файлы не могут быть используемый.

это самое близкое, что я получил, но он добавляет только префикс:

FOR %f IN (*.*) DO ren %f prefix%f

Я попытался сделать наоборот:

FOR %f IN (*.*) DO ren prefix%f %f

но, конечно, не работал, поэтому я сейчас прошу о помощи и некотором объяснении, если это возможно (мне нравится понимать, как эти вещи работают). Заранее спасибо за любую помощь.

2 ответов


Я не понимаю, почему вы не можете использовать пакетный файл. Но вот решение, которое должно работать с большинством имен файлов.

критический-сначала вы должны убедиться, что у вас есть неопределенное имя переменной, я буду использовать fname

set "fname="

далее команда на самом деле сделать переименование. Он не будет работать должным образом, если имени уже определен.

for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%")

переменная fname определяется для каждой итерации, а затем синтаксис %fname:*prefix=% заменяет первое вхождение "приставка" ни с чем. Хитрость в том, что Windows сначала пытается развернуть %fname% при первом анализе команды. Конечно, это не сработает, потому что это еще не определено. В командной строке проценты сохраняются, если переменная не найдена. Вызов вызывает дополнительную фазу расширения, которая происходит после переменная была установлена, поэтому расширение работает.

если fname определен до запуска команды, то он просто попытается переименовать то же самое файл для каждой итерации вместо значения, которое назначается в цикле.

если вы хотите снова запустить команду с другим префиксом, вам придется сначала снова очистить определение.

редактировать - вот пакетный файл с именем "RemovePrefix.bat " это делает свою работу

::RemovePrefix.bat  prefix  fileMask
@echo off
setlocal
for %%A in ("%~1%~2") do (
  set "fname=%%~A"
  call ren "%%fname%%" "%%fname:*%~1=%%"
)

Предположим, у вас есть файлы с именем "prefixName.txt", тогда вы будете использовать скрипт, выполнив

RemovePrefix  "prefix"  "*.txt"

пакетный файл переименует файлы в ваш текущий каталог. Пакетный файл также должен быть в текущем каталоге, если пакетный файл не существует в каталоге, который находится в переменной PATH. Или вы можете указать полный путь к пакетному файлу при его вызове.

правила расширения отличаются в пакетном файле. Для переменных необходимо ссылаться как %%A вместо %A, а %%fname%% не расширяется изначально, вместо этого двойные проценты преобразуются в одиночные проценты, а затем %fname% расширяется после вызов. Не имеет значения, если fname уже определен с помощью пакетного файла. SETLOCAL делает определение fname временным (локальным) для пакетного файла.


гораздо более простое решение предусмотрено в
https://superuser.com/a/871799/497147

Я скопировал его здесь для более легкого доступа.

забудьте о сложных скриптах для этого.

rename - очень старая и никогда не выполненная должным образом команда. Если вы не используете его должным образом, результат может удивить вас.

например, чтобы удалить префикс abcd С abcd1.txt, abcd2.txt, abcd3.txt etc. в чтобы получить 1.txt, 2.txt, 3.txt просто использовать

rename "abcd*.txt" "////*.txt"

вам нужно такое же количество / как количество исходных символов, которые вы хотели бы удалить.

сделайте двойные кавычки для обоих аргументов.