Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件条件_Batch File_If Statement - Fatal编程技术网

Batch file 批处理文件条件

Batch file 批处理文件条件,batch-file,if-statement,Batch File,If Statement,我正在尝试创建一个批处理文件,根据条件,它将转到批处理文件中的一个部分。目前它只起了部分作用。如果我选择“Y”安装“Holmes”,选择“N”安装“ReportServer”,选择“N”安装“Apache”,则会提示我输入“EnterSQLServerName”。但是,如果我选择“N”安装Holmes,选择“Y”安装“ReportServer”,那么它应该问我同样的问题“输入SQLServername”,但现在它就结束了。有人知道该怎么做才能让它正常工作吗 setlocal ENABLEDELA

我正在尝试创建一个批处理文件,根据条件,它将转到批处理文件中的一个部分。目前它只起了部分作用。如果我选择“Y”安装“Holmes”,选择“N”安装“ReportServer”,选择“N”安装“Apache”,则会提示我输入“EnterSQLServerName”。但是,如果我选择“N”安装Holmes,选择“Y”安装“ReportServer”,那么它应该问我同样的问题“输入SQLServername”,但现在它就结束了。有人知道该怎么做才能让它正常工作吗

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
    (数字比较)而不是
    ==
    (字符串比较)
  • 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 
第一项观察:

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