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

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

Для файлов: 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)


arrow_upward
1
arrow_downward

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