Невозможно объединить строки, разделенные запятой - PullRequest
2 голосов
/ 17 февраля 2011

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

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 ]

3 голосов
/ 17 февраля 2011

Это стандартная проблема с круглыми скобками / delayedExpansion.

Простое правило:% 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
  )
1 голос
/ 17 февраля 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
...