Использование Call SET для назначения переменной в пакете Dos «For» Loop


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

1) Вы смешиваете переменные FOR с переменными среды. Имя переменной B-типа FOR всегда является единственным символом, и это доступ через 2 процента до имени: %%c . Значение переменной FOR не может быть изменено с помощью SET.

Имя переменной среды может содержать несколько символов, хотя оно может быть одним символом, к которому обращаются путем включения имени в процентах: %var% . Восклицательные знаки могут использоваться, если вы хотите отложить расширение !var! , Значение переменной среды задается с помощью SET.

2) Трюк CALL для доступа к значениям переменных среды, которые были установлены в кодовом блоке в скобках, используется во время расширения, а не когда вы устанавливаете значение.

Я считаю, что mousio предоставил лучший ответ; Я всегда использую отложенное расширение, как в этом ответе. Но вы можете делать то, что хотите, без задержки расширения, используя правильную переменную окружения и трюк 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 при сбросе c (используя сингл = ).

  • В Windows Explorer почему мы можем создать папку или файл с символом процента (%), если символ процента используется для существующих переменных?
  • Возможно ли запустить старое 16-разрядное приложение DOS под 64-разрядной версией Windows 7?
  • Can ms dos список всех файлов и каталогов (включая скрытые)
  • Как использовать цикл for и вывод в другой каталог
  • Надежно удалите пустое место на диске в системе Win 3.1 / DOS 6.22 со встроенными инструментами
  • Taskkill - конечные задачи с названиями окон, заканчивающимися определенной строкой
  • Установите компилятор C ++ на старый компьютер MS-DOS с дискетами
  • Подключение к локальной сети - DOS для Windows 7
  • Захват экрана в DOS
  • Почему я получаю внутреннюю ошибку переполнения стека при минимизации и восстановлении окна виртуальной машины MS-DOS?
  • Давайте будем гением компьютера.