2013-12-21 77 views
0

我有一個批處理文件,它以Java文件中字符串數組的形式傳遞命令。該命令包含類似以下內容:在批處理文件中循環「數組」來移位元素

String[] commands = {"A", 
        "B", 
        "C", 
        "C:\users\user\Documents", 
        "C:\users\user\Pictures"} 

的命令陣列是動態的,因爲它改變了每一個Java程序運行時。在批處理文件中,我創建變量以獲取前三個元素(在這種情況下爲A,B和C)的值。然後我需要移動目錄字符串來佔用數組的前三個元素。下面是該批次代碼,我到目前爲止有:

@echo off 
setlocal enableDelayedExpansion 
set /A paramCount=0 
for %%x in (%*) do (
    set list[!paramCount!]=%%x 
    set /A paramCount=paramCount+1 
) 
set argA=%list[0]% 
set argB=%list[1]% 
set argC=%list[2]% 

set /A old=0 
set /A new=!old!+3 
for /F "tokens=2 delims==" %%a in ('set list[') do (
    echo old=!old! 
    echo new=!new! 
    set list[!old!]=!list[%new%]! 
    echo !list[%old%]! 
    set /A old=!old!+1 
    set /A new=!new!+1) 

我遇到的問題是與線set list[!old!]=!list[%new%]!。正如你所看到的,我已經延遲啓用。然而,!!的列表變量需要模擬數組中的一個元素。不過,我相信我也需要使用延遲擴展「新」。在這種情況下我該怎麼做?或者這可能不是真正的問題? 「舊」和「新」變量正在遞增,但echo !list[%old%]!行每次返回相同的值。我期望在這一行中存在同樣的問題,使用「old」 - 它應該包含它,但![...]已經被用於列表變量。那麼如果你需要嵌套!在一個聲明中會發生什麼?感謝您的幫助!

+0

在您的代碼中'%List [!new!]%'總是大於或等於3,並且您生成的列表一直持續到'%List [2]%',因此它不能返回正確的值。你能解釋一下你真的想要做什麼嗎?肯定有一種最簡單的方式去那裏..... – SachaDee

+0

我會盡我所能。我從包含三個初始參數的排序「數組」開始,然後是未知數量的其他參數(目錄)。我需要基本上使用前三個參數(將變量設置爲它們的值),然後將它們從仿真數組中移除並移動所有目錄,以便只有目錄保留在模擬數組中。這是否有意義,還是應該嘗試進一步解釋? – DerStrom8

回答

3
@echo off 
setlocal ENABLEDELAYEDEXPANSION 
set /A paramCount=-3 
for %%x in (%*) do (
    set list[!paramCount!]=%%x 
    set /A paramCount=paramCount+1 
) 
set argA=%list[-3]% 
set argB=%list[-2]% 
set argC=%list[-1]% 
for /F "tokens=2 delims==" %%a in ('set list[-') do SET "%%a=" 
SET arg 
SET list 
ENDLOCAL 
echo================== 
setlocal ENABLEDELAYEDEXPANSION 

set /A paramCount=0 
for %%x in (%*) do (
    set list[!paramCount!]=%%x 
    set /A paramCount=paramCount+1 
) 
set argA=%list[0]% 
set argB=%list[1]% 
set argC=%list[2]% 

set /A old=0 
set /A new=!old!+3 
for /F "tokens=2 delims==" %%a in ('set list[') do (
    echo old=!old! 
    echo new=!new! 
    CALL set list[%%old%%]=%%list[!new!]%% 
    CALL ECHO(%%list[!old!]%% 
    set /A old=!old!+1 
    set /A new=!new!+1 
) 
SET arg 
SET list 
GOTO :EOF 

這應該適合你 - 簡單的方法和困難的方法。

+0

你確定這條線嗎? CALL ECHO(%% list [!old!] %% 有些東西看起來不太正確(缺少括號?)%%列表只是將%% l作爲變量,當然這不起作用 – DerStrom8

+2

是的。這是'ECHO'的怪癖 - 直接跟在'O'後面的字符會做一些奇怪的事情'如果'var'是空的,ECHO(%var%'被發現產生一個空行,而'ECHO。%var% '會顯示'ECHO'狀態(回聲開啓/關閉)。看起來很奇怪 - 可以作爲一種享受!(當然,在這種情況下,它只是一條調試線......) – Magoo

+0

這很有效,調整,非常感謝! – DerStrom8