我寫了一個簡單的批處理文件來安裝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
設置的變量似乎從分析時擴展魔術般地逃脫,除了出現在塊內部時。
我相信「提示重整」版本只適用(八九不離十),因爲它無意中年初關閉塊,和批處理文件處理器不抱怨的第二匹配)
。
延遲擴展.... – npocmaka 2014-08-29 23:10:45
npocmaka,添加'setlocal EnableDelayedExpansion'沒有什麼區別。雖然我懷疑這是一個解析器錯誤,但它在任何方面都與變量擴展無關。 – 2014-08-29 23:13:45
當使用延遲擴展時,變量應該用'!'而不是'''括起來,至少在括號內。 – npocmaka 2014-08-29 23:15:40