2013-02-14 122 views
3

當我將驅動器號從%0存儲到變量中時,我正面臨一些意外的輸出。Windows批量變量擴展不能正常工作

下面的代碼片段從運行C:\ TEMP \測試

@echo off 
for %%I in ("%~0") do set "Target=%%~dI" 
echo Target: %Target% 
pushd %Target% && echo Current: %CD% || echo Failed to change dir! 

這將打印爲Target正確的值而不是當前目錄:

Target: C: 
Current: C:\Temp\Test 

預期的輸出:

Target: C: 
Current: C:\ 

I al所以嘗試使用延遲擴展的相同代碼,但這也不起作用。有人可以解釋這裏發生了什麼嗎?

回答

4

你的問題不變量擴展,但pushd行爲。

這種情況可以解釋pushd如何(或cd BTW)的作品

C:\>cd temp 
C:\temp>_ 

現在%cd%c:\temp。如果「移動」到另一個驅動器

C:\temp>e: 

,並嘗試

E:\>pushd c: 
C:\temp>_ 

看到現在%cd%回來C:\temp,而不是作爲C:\您所期望。

C:\temp>e: 
E:\>pushd c:\ 
C:\>_ 

帶來%cd%C:\如您所期望。

所以,你的。BAT文件可能會簡寫爲

pushd %~d0\ 
+0

+1,剛剛認識到自己是一樣的:-),但輸出仍然有問題 – jeb 2013-02-14 10:16:18

+0

'pushd%dp0'中尾隨的反斜槓是關鍵,謝謝! :) – mrt 2013-02-14 10:35:32

+0

你的意思是'pushd%〜d0'' – 2013-02-14 12:18:25

0

我無法解釋你這種行爲,但你可以用它模仿:

pushd %Target% 
if %ERRORLEVEL%==0 (echo Current: %CD%) else (echo Failed to change dir!) 
1

你爲什麼想到Current: C:\
您從C:\Temp\Test運行腳本。
因此%CD%擴展爲C:\Temp\Test是正確的。

如果你教人口會隨着你使用PUSHD %target%需要分割線,或使用延遲擴展爲!CD!,因爲在第一次完整產品線進行分析,而%的擴張完成後,執行您的PUSHD%CD%應該改變。

的另一個問題是,pushd C:不改變路徑,爲C:是相對路徑,則需要使用C:\

@echo off 
set "Target=%~d0\" 
setlocal EnableDelayedExpansion 
echo Target: %Target% 
pushd %Target% && echo Current: !CD! || echo Failed to change dir^^! 
+0

'set /?'表示'%CD%'擴展爲當前目錄名稱。 'pushd /?'表示它切換到給定的目錄。所以我認爲我的期望是合理的。你所建議的代碼給了我和我一樣的輸出(在Win XP上)。 – mrt 2013-02-14 09:48:29

+0

我修復了代碼並添加了更多解釋我的回答 – jeb 2013-02-14 10:15:34