Попытка использовать 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

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, за которой следует процент, а не то, что вы хотите.

1
 @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 при сбросе c (используя одиночный =).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .