2011-09-08 168 views
2

嗯......我嘗試儘可能少地嘗試批處理,而且我主要是C/C#/ C++的人。我的問題是我的腳本做兩個嵌套F​​OR那兒的「用戶」文件夾中運行第一和抽絲的用戶名環路,然後通過其他文件夾:批處理腳本變量不能正常工作

set BaseDir=%CD% 
cd C:\Users 
for /F %%I in ('DIR *.* /B /O:-D') do (
    set UserName=%%I 
    echo %UserName% 
) 
cd %BaseDir% 

這大致說明了問題。也許這是我的C++風格格式?也許我在批處理時很笨拙?假設我有3個用戶在我的系統(管理員,用戶1,用戶2,按照這個順序),這將打印:

Admin 
Admin 
Admin 

托特錯誤。作爲變量去,或者這是怎麼回事

Admin 
User1 
User2 

我在這裏失去了一些東西遠:如果一個人打電話給迴音就%%我一切都會按計劃進行? DOS不喜歡變量重新分配? Thnx提前。 (規格:Windows 7中,記事本,在cmd爲管理員)

+0

您可能與預定義的用戶名變量發生衝突。如果將該變量從UserName更改爲UserName2(或類似) – billinkc

+0

Wut會發生什麼?我其實只是解決了我的問題* facepalm *。解決方案是[「難以捉摸」](http://blog.crankybit.com/why-that-batch-for-loop-isnt-working/)。一個人必須設置延遲擴展...基本上,就像我們回到1969年... – user850275

+0

我相信我說我的頭回答心靈感應,當我打字我的答案0.o – Mechaflash

回答

2

既然你是FOR循環中改變一個變量,則需要啓用延遲擴展:

SETLOCAL ENABLEDELAYEDEXPANSION 
cd C:\Users 
for /F %%I in ('DIR *.* /B /O:-D') do (
set UserName=%%I 
echo %UserName% 
) 

編輯 一個巧妙的辦法來分配變量分別以訪問環路的外側的每個實例

SETLOCAL ENABLEDELAYEDEXPANSION 
SET count=1 
    cd C:\Users 
    for /F %%I in ('DIR *.* /B /O:-D') do (
    set UserName!count!=%%I 
    echo %UserName!count!% 
    set count=!count!+1 
    ) 
+0

事實上,我發佈後幾乎立即就發現了這個結論......這應該是在文檔中發佈的東西。這一定是每個人都必須學習的東西。 – user850275

2

另一種選擇是使用一個子例程:

pushd C:\Users 
for /F %%I in ('DIR *.* /B /O:-D') do call :perfile %%I 
popd 
goto :eof 

:perfile 
set UserName=%* 
echo %UserName% 
goto :eof 

還要注意使用pushd和popd以避免需要將原始目錄存儲在環境變量中。