2012-04-18 3 views
11

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

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

+0

Эти команды даже не работают хорошо с очень большими каталогами. Он продолжает добавлять префикс к файлам, к которым он уже добавил префикс. – hnviet

ответ

24

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

Critical - сначала вы должны убедиться, что у вас есть неопределенное имя переменной, я буду использовать 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", то вы должны использовать сценарий, выполнив

RemovePrefix "prefix" "*.txt" 

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

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

+0

Отлично, большое спасибо за дополнительное объяснение! Редактировать: Как дополнительный запрос, можете ли вы опубликовать пример, если он может быть выполнен в пакетном файле? – Shadow

+0

Я не знаю, как это было прекрасно - была неприятная ошибка, в которой% f путался с% f в% fname%. Теперь все исправлено :) – dbenham

+0

Какую модификацию я должен внести в этом скрипте так, что он ищет '. .txt' 'в каждом дочернем каталоге текущего каталога и удаляет данный префикс? – Kushal

23

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

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

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

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

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

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

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

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

+0

Спаситель дня. –

+0

Очень крутая и причудливая техника. Я обновил мою [Как команда Windows RENAME интерпретирует подстановочные знаки?] (Https://superuser.com/q/475874/109090) Вопросы и ответы SuperUser с этой информацией, хотя технически, '/' не функционирует как дикая карта. – dbenham

+0

Невероятно прост и отлично работает. Обратите внимание, что число «/» не связано с тем, сколько символов указано в соответствующем выражении. Другой пример: 'переименовать 'IM *. *" "////*.*" 'соответствует двухсимвольному префиксу и удаляет 4 символа – PaoloC