Каков правильный синтаксис для, если не определено goto в пакетном скрипте? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть пакетный скрипт, похожий на этот:

for /f %%a IN ('"sqlcmd -S %SQLSERVER% -d %DATABASE% -h-1 -v product="Product1" -i %SCRIPTFOLDER%\GetVersionInfo.sql"') do ( 
    set en=%%a
    set VersionProduct1=!en: =!
    )
GOTO FINDVERSIONS
******Some code in between*******

 :FINDVERSIONS
 sqlcmd -S %SQLSERVER% -d %DATABASE% -h-1 -v product="Product2" -i %SCRIPTFOLDER%\GetVersionInfo.sql
for /f %%a IN ('"sqlcmd -S %SQLSERVER% -d %DATABASE% -h-1 -v product="Product2" -i %SCRIPTFOLDER%\GetVersionInfo.sql"') do ( 
    set en=%%a
    set VersionProduct2=!en: =!
    )

sqlcmd -S %SQLSERVER% -d %DATABASE% -h-1 -v product="Product3" -i %SCRIPTFOLDER%\GetVersionInfo.sql
for /f %%a IN ('"sqlcmd -S %SQLSERVER% -d %DATABASE% -h-1 -v product="Product3" -i %SCRIPTFOLDER%\GetVersionInfo.sql"') do ( 
    set en=%%a
    set VersionProduct3=!en: =!
    )       

REM construct product paths
SET ProductPath1=.\%VersionProduct1% 
echo %VersionProduct2%
echo %VersionProduct3%
if not defined VersionProduct1 GOTO Product2
SET ProductPath2=.\%VersionProduct2% 
:Product2
echo %ProductPath2%
echo here
SET ProductPath3=.\%VersionProduct2%     
:END

Сценарий выполняет следующие действия:

Он запрашивает базу данных, чтобы получить версию установленного продукта, если продукт существуетвозвращает его версию, в противном случае строки не возвращаются.

Если возвращается номер версии, он сохраняется в переменной versionProduct, которая позже используется для создания переменной каталога для продукта.

Скажите, что product1 отсутствует в базе данных и не возвращает значения;следовательно, versionProduct1 никогда не определяется. Итак, я написал условие, если versionProduct1 не определено, перейдите к product2. Вывод после добавления команд SQL вне цикла:

enter image description here

Вывод объяснен:

. - Из одной из предыдущих строк в сценарии, не упомянутой здесь в коде.

Нет выходных данных для запуска команды SQL ранее для цикла 1 в блоке FindVersions (versionProduct2), так как он не существует

11.0.2 - запуск команды SQL для цикла 2 в блоке FindVersions (versionProduct3)

Эхо отключено - echo% VersionProduct2%

11.0.2 - echo% VersionProduct3%

1 Ответ

1 голос
/ 14 октября 2019

Проблема решена. Ошибка заключалась в использовании% <>% после блока if вместо! <>!

Я изменил скрипт на this-

  for /f %%a IN ('"sqlcmd -S %SQLSERVER% -d %DATABASE% -h-1 -v product="Product1" -i 
  %SCRIPTFOLDER%\GetVersionInfo.sql"') do ( 
      set en=%%a
      set VersionProduct1=!en: =!
  )
  GOTO FINDVERSIONS
  ******Some code in between*******

  :FINDVERSIONS
  sqlcmd -S %SQLSERVER% -d %DATABASE% -h-1 -v product="Product2" -i 
  %SCRIPTFOLDER%\GetVersionInfo.sql
  for /f %%a IN ('"sqlcmd -S %SQLSERVER% -d %DATABASE% -h-1 -v product="Product2" -i 
  %SCRIPTFOLDER%\GetVersionInfo.sql"') do ( 
      set en=%%a
      set VersionProduct2=!en: =!
  )

  sqlcmd -S %SQLSERVER% -d %DATABASE% -h-1 -v product="Product3" -i 
  %SCRIPTFOLDER%\GetVersionInfo.sql
  for /f %%a IN ('"sqlcmd -S %SQLSERVER% -d %DATABASE% -h-1 -v product="Product3" -i 
  %SCRIPTFOLDER%\GetVersionInfo.sql"') do ( 
     set en=%%a
     set VersionProduct3=!en: =!
  )       

  REM construct product paths
  if not defined VersionProduct1 (
        echo Product1 is not installed
        GOTO Product2 
  )
  SET ProductPath1=.\!VersionProduct1!

  :Product2
  if not defined VersionProduct2 (
        echo Product2 is not installed
        GOTO Product3 
  )
  SET ProductPath2=.\!VersionProduct2! 

  :Product3
  if not defined VersionProduct3 (
        echo Product3 is not installed
        GOTO END 
  )
  SET ProductPath3=.\!VersionProduct3!     
 :END
...