Использование 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
- Windows все еще полагается на MS-DOS?
- Команда echo на окнах CMD спросит меня, хочу ли я больше
- Как я могу запустить (16-разрядный) .COM исполняемый файл, который был переименован в .COS?
- Редактировать команду в Windows 8
- Установка MS-DOS на новый компьютер
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
- Полноэкранные цифровые часы для DOS 6.22?
- Какую версию MS-DOS использует Rufus для создания загрузочных USB-накопителей?
- Команда MS-DOS для удаления всех файлов, кроме одного
- Сделать DOS-игры и DOS-приложения загрузочными?
- Как предоставить загрузочный доступ MS-DOS 6.22 к файлам?
- Эквивалент badblocks на Windows или DOS
- Msgstr "Создать загрузочный диск msdos"
- Являются ли командная строка и MS-DOS одинаковыми?
У вас есть 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 (используя сингл =
).