Batch file 批处理文件条件
我正在尝试创建一个批处理文件,根据条件,它将转到批处理文件中的一个部分。目前它只起了部分作用。如果我选择“Y”安装“Holmes”,选择“N”安装“ReportServer”,选择“N”安装“Apache”,则会提示我输入“EnterSQLServerName”。但是,如果我选择“N”安装Holmes,选择“Y”安装“ReportServer”,那么它应该问我同样的问题“输入SQLServername”,但现在它就结束了。有人知道该怎么做才能让它正常工作吗Batch file 批处理文件条件,batch-file,if-statement,Batch File,If Statement,我正在尝试创建一个批处理文件,根据条件,它将转到批处理文件中的一个部分。目前它只起了部分作用。如果我选择“Y”安装“Holmes”,选择“N”安装“ReportServer”,选择“N”安装“Apache”,则会提示我输入“EnterSQLServerName”。但是,如果我选择“N”安装Holmes,选择“Y”安装“ReportServer”,那么它应该问我同样的问题“输入SQLServername”,但现在它就结束了。有人知道该怎么做才能让它正常工作吗 setlocal ENABLEDELA
setlocal ENABLEDELAYEDEXPANSION
set SETTINGS_FILE=c:\temp\settings.txt
if "%InstallHolmes%"=="" (
choice /C yn /N /M "Do you want to install Holmes? : "
if %ERRORLEVEL% ==1 (
set InstallHolmes=Y
) else (
set InstallHolmes=N
)
echo InstallHolmes=!InstallHolmes! >> %SETTINGS_FILE%
)
if "%InstallReportServer%"=="" (
choice /C yn /N /M "Do you want to install Report Server? : "
if %ERRORLEVEL% ==1 (
set InstallReportServer=Y
) else (
set InstallReportServer=N)
)
echo InstallReportServer=!InstallReportServer! >> %SETTINGS_FILE%
)
if "%InstallApache%"=="" (
choice /C yn /N /M "Do you want to install Apache? : "
if %ERRORLEVEL% ==1 (
set InstallApache=Y
) else (
set InstallApache=N
)
echo InstallApache=!InstallApache! >> %SETTINGS_FILE%
)
set "TRUE="
if "%InstallHolmes%"=="Y" set TRUE=1
if "%InstallReportServer%"=="Y" set TRUE=1
if "%TRUE%" == "1" set InstallEitherAppOrReports=Y
if "%TRUE%" == "1" goto sqlinfo
set "TRUE="
if "%InstallHolmes%"=="N" set TRUE=2
if "%InstallReportServer%"=="N" set TRUE=2
if "%TRUE%" == "2" goto end
:sqlinfo
if "%SQLServer%"=="" (
set /p SQLServer="Enter SQLServer name : "
echo SQLServer=!SQLServer!>> %SETTINGS_FILE%
)
)
第一项观察:
if "%InstallHolmes%"=="" (
choice /C yn /N /M "Do you want to install Holmes? : "
if !ERRORLEVEL! EQU 1 (
set "InstallHolmes=Y"
) else (
set "InstallHolmes=N"
)
rem `echo InstallHolmes` moved outside the `IF-block` to be always logged
)
echo InstallHolmes=!InstallHolmes! >> %SETTINGS_FILE%
而不是!错误等级
,因为%ERRORLEVEL%
变量是通过在括号中的代码块中执行前面的ERRORLEVEL
命令来更改的,因此choice
在解析阶段打开括号之前计算为其值李>%ERRORLEVEL%
(数字比较)而不是eq
(字符串比较)李>==
moved(参见上述代码片段中的注释)李>echo InstallHolmes
- 注意在
中引用(始终使用set“InstallHolmes=Y”
语法模式以避免不需要的尾随字符,例如空格)。您可以在代码中看到以下双引号的重要性: 有set“variable=value”
在set InstallReportServer=N)
中的某处带有不需要的右括号和一个尾随空格(如果“%InstallReportServer%”==“N”set TRUE=2行,请复制并粘贴set TRUE=2
)
或:
set "TRUE="
if "%InstallHolmes%"=="Y" set "TRUE=1"
if "%InstallReportServer%"=="Y" set "TRUE=1"
因此,如果“%TRUE%”==“1”转到sqlinfo,则以下在所有YY
、YN
、NY
情况下均有效,并且仅在%InstallHolmes%%InstallReportServer%
情况下无效
逻辑和
可以是
if "%InstallHolmes%%InstallReportServer%" == "YY" set "TRUE=1"
或
第三个观察:避免不必要地执行继有条件的goto
之后的代码,如下所示:
if "%TRUE%" == "2" goto end
echo script should not reach the :sqlinfo label line
goto :somewhere
:sqlinfo
第一项观察:
if "%InstallHolmes%"=="" (
choice /C yn /N /M "Do you want to install Holmes? : "
if !ERRORLEVEL! EQU 1 (
set "InstallHolmes=Y"
) else (
set "InstallHolmes=N"
)
rem `echo InstallHolmes` moved outside the `IF-block` to be always logged
)
echo InstallHolmes=!InstallHolmes! >> %SETTINGS_FILE%
!错误等级
而不是%ERRORLEVEL%
,因为ERRORLEVEL
变量是通过在括号中的代码块中执行前面的choice
命令来更改的,因此%ERRORLEVEL%
在解析阶段打开括号之前计算为其值李>
eq
(数字比较)而不是==
(字符串比较)李>
echo InstallHolmes
moved(参见上述代码片段中的注释)李>
- 注意在
set“InstallHolmes=Y”
中引用(始终使用set“variable=value”
语法模式以避免不需要的尾随字符,例如空格)。您可以在代码中看到以下双引号的重要性:
有set InstallReportServer=N)
在set TRUE=2
中的某处带有不需要的右括号和一个尾随空格(如果“%InstallReportServer%”==“N”set TRUE=2
行,请复制并粘贴)
第二个观察:下一个代码片段的工作原理类似于逻辑或:
set "TRUE="
if "%InstallHolmes%"=="Y" set "TRUE=1"
if "%InstallReportServer%"=="Y" set "TRUE=1"
因此,如果“%TRUE%”==“1”转到sqlinfo,则以下在所有YY
、YN
、NY
情况下均有效,并且仅在%InstallHolmes%%InstallReportServer%
情况下无效
逻辑和
可以是
if "%InstallHolmes%%InstallReportServer%" == "YY" set "TRUE=1"
或
第三个观察:避免不必要地执行继有条件的goto
之后的代码,如下所示:
if "%TRUE%" == "2" goto end
echo script should not reach the :sqlinfo label line
goto :somewhere
:sqlinfo