使用调用 SET 在 Dos 批处理“For”循环中指定变量

使用调用 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

)

冰球.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

答案1

您有两个问题:

1) 您混淆了 FOR 变量和环境变量。批处理 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 变量后跟百分号 - 这不是您想要的。

答案2

 @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并了解何时以及如何使用它(用!而不是%)。
此外,重置 c 时无需使用call(使用单个=)。

相关内容