Невозможно объединить строки, разделенные запятой

Меня сводит с ума глупо простая проблема, которая съедает мое время. Я просто хочу добавить строки, разделенные запятой, но запятая не добавляется. Ниже приведен фрагмент моего командного файла:

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

Для отладки, когда я ввел в пакетный файл некоторые операторы эха, результаты были еще более странными:

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

У кого-нибудь есть идеи? Это расстраивает меня до бесконечности.


person Hugh Darling    schedule 17.02.2011    source источник


Ответы (2)


Это стандартная проблема со скобками/задержкой расширения.

Простое правило заключается в том, что %var% раскрывается до выполнения блока скобок (во время синтаксического анализа).

Если вам понадобится var-расширение позже, вы должны использовать отложенное расширение.
Объяснение в set /?

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
  )
person jeb    schedule 17.02.2011
comment
Это стиль отложенного расширения, описанный в разделе set /? - person jeb; 18.02.2011

Что-то вроде проблемы с обзором. Я смог обойти это, разветвляясь с помощью 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
person nithins    schedule 17.02.2011