2015-09-03 208 views
1

我想創建一個批處理文件,其中基於條件,它將轉到批處理文件中的一個部分。目前它只有部分工作。如果我選擇'Y'安裝'Holmes','N'選擇'ReportServer','N'選擇'Apache',那麼它會提示我輸入「SQLServerName」。但是,如果我選擇'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% 
) 
) 

回答

0

第一觀察:

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%作爲ERRORLEVEL變量由括號choice命令之前的代碼塊內改變,因此%ERRORLEVEL%評估爲它打開之前的值解析階段括號;
  • EQU(數字比較)而不是==(字符串比較);
  • echo InstallHolmes已移動(請參閱上述代碼段中的註釋);
  • 請注意set "InstallHolmes=Y"中的引用(始終使用set "variable=value"語法模式以避免不需要的尾隨字符,例如空格)。你可以看到雙引號重要性低於代碼: 有set InstallReportServer=N)與不必要的右括號和尾部空間某處set TRUE=2(複印件&粘貼if "%InstallReportServer%"=="N" set TRUE=2線)...

第二觀察:下面的代碼片段就像邏輯OR

set "TRUE=" 
if "%InstallHolmes%"=="Y" set "TRUE=1" 
if "%InstallReportServer%"=="Y" set "TRUE=1" 

因此,以下if "%TRUE%" == "1" goto sqlinfo是有效的在所有YYYNNY案件%InstallHolmes%%InstallReportServer%只有在T無效他NN案件。

邏輯AND可以是任一

if "%InstallHolmes%%InstallReportServer%" == "YY" set "TRUE=1" 

if "%InstallHolmes%"=="Y" if "%InstallReportServer%"=="Y" set "TRUE=1" 

第三觀察:避免不必要的執行,其成功一個條件goto如下代碼:

if "%TRUE%" == "2" goto end 

echo script should not reach the :sqlinfo label line 
goto :somewhere 
:sqlinfo