我有一个类似这样的批处理脚本:
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命令后的输出:
输出说明:
。 -从脚本的前几行中(此处代码未提及)。
由于FindVersions块(版本Product2)中不存在用于循环1之前的SQL命令的运行的输出,所以不存在
11.0.2-在FindVersions块(versionProduct3)中为循环2之前运行SQL命令
回显已关闭-echo%VersionProduct2%
11.0.2-echo%VersionProduct3%
问题已解决。错误是在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