2014-08-29 27 views
0

我寫了一個簡單的批處理文件來安裝Windows 7下的程序有一個發瘋的錯誤我正在與set /p VAR=PROMPT變量不會設置/ P內部IF語句

輸入丟棄錯誤

這裏有一個簡單的測試案例:

@echo off 
setlocal 

if exist "%USERPROFILE%\Documents" (
    set /p CONFIRM="Previous version is installed! Continue? (Y/n) " 
    echo {%CONFIRM%} 
) 

if exist "%USERPROFILE%\Documents" (
    set /p CONFIRM="Previous version is installed! Continue? (Y/n) " 
    echo {%CONFIRM%} 
) 

我運行它:

Previous version is installed! Continue? (Y/n) n 
{} 
Previous version is installed! Continue? (Y/n) n 
{n} 

請注意,當第一個set /p運行時,它實際上不會保存我的輸入!

提示忙玲蟲(有關?)

我懷疑,但我不知道,如果這是在set /p,其中,在第一)截斷的提示,如果裏面的括號定義與一個更明顯的bug在if塊:

@echo off 

if exist "%USERPROFILE%\Documents" (
    set /p CONFIRM=Previous version is installed! Continue? (Y/n) 
    echo {%CONFIRM%} 
) 

至少這個版本抓住我的投入,儘管它軋液提示:

Previous version is installed! Continue? (Y/nn 
{n} 

變通辦法?

任何想法?或者是set /p只是如此越野車,我不能使用它?

編輯:結論

感謝來自@npocmaka鏈接和技巧,我想我有一個更好的主意,這是怎麼回事:「分析時間」與「運行時間」是不是()內相同作爲外部的有限塊。因此,這個例子:

@echo off 

(
    set /p CONFIRM=^? 
    echo {%CONFIRM%} 
) 

(
    set /p CONFIRM=^? 
    echo {%CONFIRM%} 
) 

echo {%CONFIRM%} 

運行時,很明顯,有一個「延遲」的變量獲得區塊內的預期值:

?foo 
{} 
?bar 
{foo} 
{bar} 

雖然延遲擴建工程,我仍然相信這行爲與我讀過的關於set /p應該如何工作的每個描述都不一致,儘管這對批處理文件來說是相同的。似乎由set /p設置的變量似乎從分析時擴展魔術般地逃脫,除了出現在塊內部時。

我相信「提示重整」版本只適用(八九不離十),因爲它無意中年初關閉塊,和批處理文件處理器不抱怨的第二匹配)

+1

延遲擴展.... – npocmaka 2014-08-29 23:10:45

+0

npocmaka,添加'setlocal EnableDelayedExpansion'沒有什麼區別。雖然我懷疑這是一個解析器錯誤,但它在任何方面都與變量擴展無關。 – 2014-08-29 23:13:45

+1

當使用延遲擴展時,變量應該用'!'而不是'''括起來,至少在括號內。 – npocmaka 2014-08-29 23:15:40

回答

1
@echo off 
setlocal enableDelayedExpansion 

if exist "%USERPROFILE%\Documents" (
    set /p CONFIRM="Previous version is installed! Continue? ^(Y/n^) " 
    echo {!CONFIRM!} 
) 

if exist "%USERPROFILE%\Documents" (
    set /p CONFIRM="Previous version is installed! Continue? ^(Y/n^) " 
    echo {!CONFIRM!} 
) 
Endlocal 

這工作?