Dos Batch - для цикла - PullRequest
       3

Dos Batch - для цикла

2 голосов
/ 10 мая 2011

Может кто-нибудь сказать мне, почему в приведенном ниже примере значение LIST всегда пусто, я также хотел бы получить только первые 4 символа %% i в переменной LIST

cd E:\Department\Finance\edi\Japan_orders\
FOR /f %%i IN ('dir /b *.*') DO ( 

   copy %%i  E:\Department\Finance\Edi\commsfile.txt        

   set LIST=%%i
   echo %LIST%

   if %%i == FORD110509 CALL E:\Department\Finance\edi\EXTRACT.exe E:\Department\Finance\edi\COMMSFILE.TXT

)
pause

заранее спасибо

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Командные блоки в скобках анализируются полностью, и это делается до до их выполнения. Следовательно, ваше выражение %LIST% раскрывается в начале, а переменная LIST все еще пуста. Когда наступает время выполнения echo %LIST%, там уже не %LIST%, а только пустая строка (читай: «ничего»). Просто так работает (не спрашивайте меня почему).

В таких случаях используется механизм отложенного расширения, и Джои уже сказал вам, что вам нужно использовать специальный синтаксис !LIST! вместо %LIST%, который сначала должен быть включен (как правило, командой SETLOCAL EnableDelayedExpansion, о котором он также упомянул).

С другой стороны, вы можете извлечь подстроку из значения, но сначала значение должно быть сохранено в переменной. По сути, синтаксис для извлечения подстрок один из них:

%VARIABLE:~<i>offset</i>,<i>charcount</i>%
%VARIABLE:~<i>offset</i>%

То есть вы должны указать начальную позицию (начиная с 0) и, необязательно, количество символов, которые нужно вырезать из значения. (Если quantity опущено, то вы просто обрезаете исходную строку со смещением до конца.) Вы можете узнать больше об этом, введя HELP SET из командной строки (подождите, это та же команда, о которой упоминал Джои! ).

Еще одна вещь: не забывайте о отложенном расширении. Вам необходимо изменить приведенный выше синтаксис % на !. В вашем случае правильное выражение для получения первых 4 символов будет:

!LIST:~0,4!

Вы можете использовать его напрямую или сначала сохранить его в LIST, а затем просто использовать !LIST! везде, где вам нужна подстрока.

2 голосов
/ 10 мая 2011

Вам нужно отложенное расширение. Добавьте следующее в начале вашей программы:

setlocal enabledelayedexpansion

и затем используйте !LIST! вместо %LIST% внутри цикла.

Для подробного объяснения, пожалуйста, прочитайте help set.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...