Использование Call SET для определения переменной в цикле Dos "For"
Попытка использовать Call SET для установки переменной в цикле пакетного файла Windows. Не работает, но вот файл ввода / вывода. пытаясь назначить Var C равным 1.
Пакетный файл:
@ECHO OFF
for /f "tokens=1-3 delims=," %%a in (Puck.csv) do (
echo Hello No Hockey>%%a.txt
echo #:A %%a>>%%a.txt
echo #:B %%b>>%%a.txt
if /I %%c gtr 10 call set %%c==1
echo #:C %%c>>%%a.txt
)
Puck.csv
1991,NHL Strike,20
1992,NHL Strike,20
1993,NHL Strike,20
Выход:
Hello No Hockey
#:A 1991
#:B NHL Strike
#:C 20
Hello No Hockey
#:A 1992
#:B NHL Strike
#:C 20
Hello No Hockey
#:A 1993
#:B NHL Strike
#:C 20
2 ответа
У вас есть 2 проблемы:
1) Вы путаете переменные FOR с переменными окружения. Пакетное имя переменной FOR всегда представляет собой один символ, и доступ к нему осуществляется через 2 процента до имени: %%c
, Значение переменной FOR нельзя изменить с помощью SET.
Имя переменной среды может содержать несколько символов, хотя это может быть один символ, к которому можно обратиться, заключив имя в проценты: %var%
, Восклицательные знаки можно использовать, если вы хотите отложенное расширение: !var!
, Значение переменной среды устанавливается с помощью SET.
2) Трюк CALL для доступа к значениям переменных среды, которые были установлены в заключенном в скобки кодовом блоке, используется во время раскрытия, а не при установке значения.
Я считаю, что Мусио предоставил лучший ответ; Я всегда использую замедленное расширение, как в этом ответе. Но можно сделать то, что вы хотите, без отложенного расширения, правильно используя переменную окружения и трюк CALL.
@echo off
for /f "tokens=1-3 delims=," %%a in (Puck.csv) do (
echo Hello No Hockey>%%a.txt
echo #:A %%a>>%%a.txt
echo #:B %%b>>%%a.txt
set C=%%c
if /i %%c gtr 10 set C=1
call echo #:C %%C%%>>%%a.txt
)
Обратите внимание, что крайне важно, чтобы регистр переменной FOR отличался от переменной среды. Переменные FOR чувствительны к регистру, переменные среды - нет. Если вы используете c
для обоих то парсер будет лечить %%c%%
в качестве переменной FOR следует процент, а не то, что вы хотите.
@ECHO OFF
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=," %%a in (Puck.csv) do (
echo Hello No Hockey>%%a.txt
echo #:A %%a>>%%a.txt
echo #:B %%b>>%%a.txt
set c=%%c
if /I !c! gtr 10 set c=1
echo #:C !c!>>%%a.txt
)
Просто поиск enabledelayedexpansion
и узнать, когда и как его использовать (с !
вместо %
).
Также нет необходимости использовать call
при сбросе с (используя один =
).