2010-06-11 145 views
3

我在下面用set /p來讀取用戶輸入 它似乎在if塊之外工作,但是如果塊不工作,那麼在塊內部工作。 當我第二次運行腳本時,用戶在if塊中輸入的內容會打印上一個用戶輸入。批處理腳本中的問題讀取用戶輸入

測試腳本:

@echo off 
set cond=true 
echo %cond% 
if %cond%==true (
echo "cond is true" 
REM the below input doesn't work 
set /p name1="enter your name" 
echo name is: %name1% 
) 

REM it works here 
set /p name2="enter your name" 
echo name is: %name2% 

謝謝

回答

10

help set閱讀上延遲擴展。

默認情況下,當cmd解析一行時,環境變量(%foo%)被展開。在這種情況下,一行是一個單獨的語句,可以包括一個完整的加括號的塊。因此,在解析塊之後,在解析時,所有出現的環境變量都將替換爲其值。如果您在塊中更改了一個變量並再次使用該變量,則會看到原來的值,因爲它已被替換。

延遲擴展,其可以與標記後感歎號代替百分號(!foo!

​​

原因環境變量被啓用以進行執行的陳述後解析是之前直接評估。

@echo off 
setlocal enabledelayedexpansion enableextensions 
set cond=true 
echo %cond% 
if %cond%==true (
echo "cond is true" 
REM the below input does work now 
set /p name1="enter your name" 
echo name is: !name1! 
) 
+0

您還可以使用'/ V:ON'開關啓動'CMD.EXE'。 – NealB 2010-06-11 18:34:14

+0

@neal:對於大多數不是可行的批處理文件。 – Joey 2010-06-11 18:34:57

+0

非常感謝你...這對我來說是新的..你知道嗎我可以閱讀有關它的任何好資源嗎? – jch 2010-06-11 18:50:30