2010-09-06 53 views
4

我在循環的DOS腳本中有一個變量賦值問題。它從不分配值,它總是空白。以下示例代碼%%一個的循環的DOS批處理文件中的變量賦值問題

@echo off 
set ans=%1 
SET STRING=%ans:"=% 

echo Parsing the string "%STRING%": 
for /f "tokens=1-2" %%a in ("%STRING%") do (
set Word1 =%%a 
echo Word 1: %%a 
echo Word 1: %Word1% 
set Word2 =%%b 
if %%b.==. (Set server =\\.\pipe\mssql$microsoft##ssee\sql\query) else (Set server =%%b) 
) 
echo Server name "%server%" 
sqlcmd -s %server% 

值不被分配給變量字1。但是當我回顯%% a時,它顯示正確的值。以及在最後一個空值檢查是否條件,服務器變量從未設置。我在這裏很困惑。有人可以幫我嗎??

P.S:輸入腳本是任何2字字符串(如:a.bat 「L DEV-服務器」)

回答

11

您需要使用延遲擴展 - !Word1!代替%Word1%

默認情況下,當shell首先讀取語句時,所有變量將被其當前值替換,並且每當該行被命中時使用修改後的語句。這就是DOS的工作原理,並且它保持在Windows外殼中以實現向後兼容。

另一方面,延遲擴展在每次語句命中時重新插入值。那會給你想要的結果。

+4

請注意,正如本頁http://ss64.com/nt/setlocal.html所述,默認情況下未啓用延遲擴展。 要啓用它,您需要在您的腳本中添加以下行: SETLOCAL EnableDelayedExpansion – 2012-10-31 17:08:56

+0

感謝Diego獲取更多信息。 – Sven 2014-04-07 05:29:23