Файл обрабатывается более одного раза в пакетном файле Windows For ... Loop.Зачем? - PullRequest
2 голосов
/ 06 апреля 2011

Я написал простой пакетный скрипт для циклического просмотра файлов в определенном каталоге и добавления текста (имени клиента) к имени файла. Скрипт работает отлично; однако последний измененный файл в каталоге, по-видимому, изменяется дважды. Я попробовал два подхода к проблеме - использование pushd для каталога и перечисление полного пути в цикле for (код для каждого ниже).

В обоих подходах я получаю что-то вроде следующего (предположим, что третий файл является последним измененным файлом):

Оригинальные имена файлов:

SomeFile1.rtf  
SomeFile2.rtf  
SomeFile3.rtf  

Переименованные имена файлов:

TextToPrepend_SomeFile1.rtf  
TextToPrepend_SomeFile1.rtf  
TextToPrepend_TextToPrepend_SomeFile1.rtf

Нет, это не опечатка в третьем файле. Он обрабатывается во второй раз, а TextToPrepend добавляется во второй раз. Я довольно плохо знаком с пакетными сценариями Windows и пытался исследовать эту проблему, но не могу найти причину, по которой он это делает. Любая помощь приветствуется.

Код:

pushd C:\Images\Data\

rem setlocal ENABLEDELAYEDEXPANSION

for %%X in (*.rtf) do (  
   ren "%%X" TEXTTOPREPEND_"%%X"  
)

popd

- и -

rem setlocal ENABLEDELAYEDEXPANSION

for %%X in (C:\Images\Data\\*.rtf) do (  
   ren "%%X" TEXTTOPREPEND_"%%~nX".rtf  
)

Если это поможет, пакетный сценарий выполняется на компьютере под управлением Windows Server 2008.

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

Вы, очевидно, ошибочно предполагаете, что шар расширяется до начала цикла. Я знаю, что это не так в DOS. Решение:

for %%X in (*.rtf) do (
   ren "%%X" "TEXTTOAPPEND_%%~nX._rtf"
)
ren *._rtf *.rtf

или

md tmp
for %%X in (*.rtf) do (
   move "%%X" "TEXTTOAPPEND_%%~nX.rtf"
)
move tmp\* .
rd tmp

В данный момент отсутствует на моем компьютере с Windows, поэтому не могу проверить, могу ли я повторить ваше поведение.

3 голосов
/ 06 апреля 2011

Это, кажется, делает трюк с меньшим количеством кода:

for /f "delims=" %%X in ('dir /b *.rtf') do ren "%%X" TEXTTOPREPEND_"%%X"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...