尝试使用 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
(使用单个=
)。