2016-03-17 140 views
0

我已經創建了一個批處理文件,該文件應該將三個連接的接口描述分配爲自定義變量,然後打印這些變量中的每一個。最終,我不打算打印使用這些變量來根據輸出配置接口本身,但現在很高興看到它正確地分配變量。使用遞增變量的批處理文件FOR循環

這是我正在努力解決這個:

set cnt=1 
for /f "tokens=12,13*" %%f in ('ipconfig /all^|findstr "Description"') do (
    setlocal enabledelayedexpansion 
    set "mess.!cnt!.name=%%h" 
    endlocal 
    set /a cnt+=1 
) 
echo mess.0.name 
for /l %%t in (1,1,%cnt%) do (
    echo mess.%%t.name 
    echo "%mess.0.name%" 
) 
pause 

雖然我已經通過幾乎每一個可以想象的方式使用delayedexpansion走了,我不能讓批處理文件來考慮mess.cnt.name作爲隨每個循環遞增的變量。

下面是輸出的一個樣本:

C:\Users\admin\Desktop>test1.bat 

C:\Users\admin\Desktop>set cnt=1 

C:\Users\admin\Desktop>for /F "tokens=12,13*" %f in('ipconfig /all|findstr "Des 
cription"') do (
setlocal enabledelayedexpansion 
    set "mess.!cnt!.name=%h" 
    endlocal 
    set /a cnt+=1 
) 

C:\Users\admin\Desktop>(
setlocal enabledelayedexpansion 
    set "mess.!cnt!.name=AirLink USB Ethernet/RNDIS" 
    endlocal 
    set /a cnt+=1 
) 

C:\Users\admin\Desktop>(
    setlocal enabledelayedexpansion 
    set "mess.!cnt!.name=LAN9500 USB 2.0 to Ethernet 10/100 Adapter" 
    endlocal 
    set /a cnt+=1 
) 

C:\Users\admin\Desktop>(
    setlocal enabledelayedexpansion 
    set "mess.!cnt!.name=Intel(R) 82579LM Gigabit Network Connection" 
    endlocal 
    set /a cnt+=1 
) 

C:\Users\admin\Desktop>echo mess.0.name 
mess.0.name 

C:\Users\admin\Desktop>for /L %t in (1 1 4) do (
echo mess.%t.name 
echo "Intel(R) 82579LM Gigabit Network Connection" 
) 
C:\Users\admin\Desktop>(
echo mess.1.name 
echo "Intel(R) 82579LM Gigabit Network Connection" 
) 
mess.1.name 
"Intel(R) 82579LM Gigabit Network Connection" 

C:\Users\admin\Desktop>(
echo mess.2.name 
echo "Intel(R) 82579LM Gigabit Network Connection" 
) 
mess.2.name 
"Intel(R) 82579LM Gigabit Network Connection" 

C:\Users\admin\Desktop>(
echo mess.3.name 
echo "Intel(R) 82579LM Gigabit Network Connection" 
) 
mess.3.name 
"Intel(R) 82579LM Gigabit Network Connection" 

C:\Users\admin\Desktop>(
echo mess.4.name 
echo "Intel(R) 82579LM Gigabit Network Connection" 
) 
mess.4.name 
"Intel(R) 82579LM Gigabit Network Connection" 

C:\Users\admin\Desktop>pause 
Press any key to continue . . . 

任何幫助將非常感激。這幾天我一直在我的頭上撞牆。

維克多

回答

0
@ECHO OFF 
SETLOCAL 
set cnt=0 
for /f "tokens=1,14*" %%f in ('ipconfig /all^|findstr "Description"^|find /n /v ""') do (
    set "mess%%fname=%%h" 
    set /a cnt+=1 
) 
echo %mess[1]name% 
for /l %%t in (1,1,%cnt%) do (
    CALL echo mess[%%t]name=%%mess[%%t]name%% 
) 
SET mess 

GOTO :EOF 

從本質上講,endlocal被打了退堂鼓的mess.?.name設置和經典的治療不會在一個代碼塊的工作。

同樣,報告循環(我增加了另一種方式),您需要設置delayedexpansion來顯示,或者使用我所顯示的語法。

現在 - 如果您在整個例程中恰好放置了一個setlocal/endlocal並且未在代碼塊中切換,它可能會更輕鬆地工作。

OR-你可以調用內部子程序做set婷...

+0

謝謝你脫線救了我的理智。你是我最好的朋友。然而,我想知道爲什麼在echo命令之前需要CALL。仍然無法找到關於這個技巧的細節。 – Victor

+0

@Victor,如果這個答案對您有幫助,請考慮通過點擊接下來的勾號來接受它;這標誌着你的問題已解決,並顯示其他用戶的這篇文章的價值...... – aschipfl

+0

'CALL ECHO'是一個解析技巧。調用''的參數被解析,然後執行。解析器使用'%'替換'%% t'(一個當前的元變量)和其他'%%'(因爲'%'轉義'%')。因此,執行的是回聲混亂[* valueof %% t *] name =%mess [* valueof %% t *] name%' – Magoo