Имя файла добавлено более одного раза

Я использую пакетный файл для добавления нескольких имен файлов.

Для файлов: 1.txt, 2.txt, 3.txt, 4.txt, 5.txt — я хочу добавить copy_1.txt

set "nname=copy_"

for %%A in (*.txt) do (
ren %%A %nname%%%A
)
exit

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

Вот вывод cmd:

> for %A in (*.txt) do (ren %A copy_%A )
> (ren 1.txt copy_1.txt )
> (ren 2.txt copy_2.txt )
> (ren 3.txt copy_3.txt )
> (ren 4.txt copy_4.txt )
> (ren 5.txt copy_5.txt )
> (ren copy_1.txt copy_copy_1.txt )

Может ли кто-нибудь объяснить мне, почему это происходит и как можно избежать этой проблемы?

Я пытался добавить «обработчик исключений», но это бесполезно.

set "nname=copy_"

for %%A in (*.txt) do (
if exist %nname%%%A goto :exit
ren %%A %nname%%%A
)
:exit
echo file exists

Заранее спасибо!


person Nicholas W.    schedule 31.07.2012    source источник


Ответы (1)


Оболочка не завершает свой список файлов до того, как начнет обрабатывать вашу команду переименования, поэтому результаты первой команды переименования, а именно copy_1.txt, становятся совпадающими с *.txt.

Один из способов избежать этого:

for /F "usebackq" %%A in (`dir /b *.txt`) do (ren %%A %nname%%A)
person David I. McIntosh    schedule 31.07.2012
comment
Спасибо! Он отлично работает, намного лучше, чем работа с временными папками, которую я делал. Просто для ясности: использование функции usebackq с ` заставляет оболочку завершить цикл *.txt перед продолжением? - person Nicholas W.; 31.07.2012
comment
Параметр /F позволяет использовать выходные данные команды в качестве входных данных для команды for. Параметр usebackq просто меняет, является ли это строкой '' или строкой '`, которая обрабатывается как команда для выполнения. (Лучше добавить параметр usebackq и поместить вашу команду в .) What happens then is that the shell processes the text within the как команду, выполнить эту команду, а затем получить вывод этой команды (stdout из команды) и обрабатывать его построчно. Каждая строка разделена символы пробела в токены, а токены присваиваются переменным for. - person David I. McIntosh; 01.08.2012
comment
В вашем цикле у вас есть только одна переменная, %%A, поэтому только первый токен в каждой строке вывода назначается %%A. Но dir /b *.txt выводит именно то, что вы хотите: одну строку на файл только с именем файла. Тот факт, что dir ... завершается до того, как цикл for начинает выполняться, является просто капризом оболочки - в чем я даже не был уверен, пока не протестировал его. - person David I. McIntosh; 01.08.2012