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

Я пытаюсь изменить все имена файлов в текущей папке, и я пытаюсь добиться этого либо путем удаления префикса файлов (каждый файл имеет общий префикс), либо изменения их имен на их количество (если есть 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

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

Ответ 1

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

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

set "fname="

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

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

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

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

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

EDIT. Вот командный файл с именем "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", тогда вы использовали бы script, выполнив

RemovePrefix  "prefix"  "*.txt"

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

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

Ответ 2

Более простое решение предоставляется в
https://superuser.com/a/871799/497147

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

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

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

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

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

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

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