如果在批处理脚本中未定义goto,正确的语法是什么?

问题描述 投票:0回答:1

我有一个类似这样的批处理脚本:

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。在for循环外添加SQL命令后的输出:

enter image description here

输出说明:

。 -从脚本的前几行中(此处代码未提及)。

由于FindVersions块(版本Product2)中不存在用于循环1之前的SQL命令的运行的输出,所以不存在

11.0.2-在FindVersions块(versionProduct3)中为循环2之前运行SQL命令

回显已关闭-echo%VersionProduct2%

11.0.2-echo%VersionProduct3%

batch-file cmd command-prompt
1个回答
0
投票

问题已解决。错误是在if块之后使用%<>%而不是!<>!

我将脚本更改为此-

  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
© www.soinside.com 2019 - 2024. All rights reserved.