无法连接用逗号分隔的字符串

时间:2011-02-17 17:38:46

标签: batch-file concatenation dos

我被一个耗费时间的愚蠢简单问题所驱使。我只想追加用逗号分隔的字符串,但逗号不会被追加。以下是我的批处理文件片段:

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

有没有人有任何想法?这让我感到很沮丧。

2 个答案:

答案 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