我被一个耗费时间的愚蠢简单问题所驱使。我只想追加用逗号分隔的字符串,但逗号不会被追加。以下是我的批处理文件片段:
set MissingParams=
set SwitchURL=
set TrustStore=
if 0%SwitchURL%==0 (set MissingParams=SwitchURL)
if 0%TrustStore%==0 (
if not 0%MissingParams%==0 (
set MissingParams=%MissingParams%,
)
set MissingParams=%MissingParams%TrustStore
)
在我回显%MisingParams%
后运行此脚本后,预期值为SwitchURL,TrustStore
,但它只是打印
SwitchURLTrustStore
。
D:\deleteme>echo %MissingParams%
SwitchURLTrustStore
对于调试,当我在批处理文件中引入一些echo语句时,结果更加古怪:
set MissingParams=
if 0%SwitchURL%==0 (set MissingParams=SwitchURL)
if 0%TrustStore%==0 (
if not 0%MissingParams%==0 (
echo MissingParams=%MissingParams%
set MissingParams=%MissingParams%,
echo MissingParams=%MissingParams%
)
set MissingParams=%MissingParams%TrustStore
echo MissingParams=%MissingParams%
)
当我运行上面的脚本时,它会打印
MissingParams=SwitchURL
MissingParams=SwitchURL
MissingParams=SwitchURL
当我从命令提示符回显值时,就像之前得到SwitchURLTrustStore
D:\deleteme>echo %MissingParams%
SwitchURLTrustStore
有没有人有任何想法?这让我感到很沮丧。
答案 0 :(得分:3)
这是标准的括号/延迟扩展问题。
简单的规则是%var%在之前扩展执行括号块(解析时)。
如果您以后需要变速扩展,则应使用延迟扩展 在设置/?
中进行了说明setlocal EnableDelayedExpansion
set MissingParams=
set SwitchURL=
set TrustStore=
if 0!SwitchURL!==0 (set MissingParams=SwitchURL)
if 0!TrustStore!==0 (
if not 0!MissingParams!==0 (
set MissingParams=!MissingParams!,
)
set MissingParams=!MissingParams!TrustStore
)
答案 1 :(得分:1)
看起来像一个范围问题。我能够通过分支与goto工作来解决这个问题。这是我的版本与额外的调试废话:
@echo off
set MissingParams=
set SwitchURL=
set TrustStore=
if "%SwitchURL%"=="" (set MissingParams=SwitchURL)
echo MissingParams1 is %MissingParams%
if "%TrustStore%" EQU "" (GOTO :BRANCH1)
:RESUME
echo MissingParams3 is %MissingParams%
set MissingParams=%MissingParams%TrustStore
echo MissingParams4 is %MissingParams%
)
echo MissingParamsF is %MissingParams%
GOTO :eof
:BRANCH1
if "%MissingParams%" NEQ "" (set MissingParams=%MissingParams%,)
GOTO RESUME