2013-11-14 70 views
2

我在包含多個文件目錄的批處理文件中有一個數組。我想刪除數組中的前三個元素,並將所有內容都移過來(即第四個元素代替第一個元素,第五個元素代替第二個元素,第六個代替第三個元素等)。這是可以在批處理腳本中完成的事情嗎?刪除批處理文件中的數組中的元素

實施例:

[directoryA, directoryB, directoryC, directoryD, directoryE, directoryF] 

被改變爲:

[directoryD, directoryE, directoryF] 

這裏是我對 「陣列」 的代碼:

set paramCount=0 
for %%x in (%*) do (
    set /A paramCount+=1 
    set "dirs[!paramCount!]=%%x" 
) 
+0

哪批腳本shell是這樣的? DOS/WINDOWS? –

+0

哎呀,對不起 - 忘了提及。我在寫一個基本的Windows .bat文件。我只是從批處理腳本開始,所以我不確定這是否是您正在尋找的答案。 – DerStrom8

+0

你運行的是哪個版本的Windows? Windows 7的? 8?我? –

回答

2

最好是我能想到的要做到這一點是有兩個「數組」,一個用於數據,另一個用於數據是否當前有效。下面的示例代碼將創建一個包含任何命令行參數的dirs「數組」,然後創建另一個valid「數組」,然後僅從dirs打印「有效」數據。當且僅當dirs[i]中的數據有效時,將等於1valid[i]中的任何其他值將指示dirs[i]中的數據將被忽略。

@echo off 
setlocal enabledelayedexpansion 

set paramCount=0 
for %%x in (%*) do (
    echo %%x 
    set /A paramCount+=1 

    REM Add data to dirs array 
    set "dirs[!paramCount!]=%%x" 

    REM Add valid flag to valid array 
    set "valid[!paramCount!]=1" 
) 

echo Printing... 

REM Delete element at index 2 
set valid[2]=0 

REM Print the modified array 
for /L %%a in (1 1 %paramCount%) do (
    IF !valid[%%a]!==1 (echo !dirs[%%a]!) 
) 

示例輸出:

$>deletetest.bat 1 2 3 4 
1 
2 
3 
4 
Printing... 
1 
3 
4 
+0

非常有趣的想法。我沒有想過這樣做。我最終做的是將前三個元素設置爲null,然後使用for循環創建另一個「數組」。 for循環會遍歷目錄,檢查它們的值是否爲空,如果不是,則會將它添加到新的「數組」中。然後我使用新的數組作爲參考。 謝謝大家的幫助! – DerStrom8

+0

我也遇到了同樣的方法,但它比上面的方法稍微冗長一些(需要在完成任何修改後完全重建數組),而上面的解決方案允許您隨時重建。 –

+0

你有一個非常好的點。現在我只是想讓它起作用,並且最終我會進行微調和清理。在時間到的時候,我可能會將更詳細的代碼段轉換出來,而且您一直很有幫助。我將用它作爲接受的答案,並可能在稍後實施。 – DerStrom8

2

對不起。我想陳述一些關於這個話題的意見。

你有不是表示其中你的「數組」來自於。你可以把它存儲在一個變量,例如:

set dirs=directoryA directoryB directoryC directoryD directoryE directoryF 

然而,這是不是一個陣列,但列表

set dirs=%* 

如果要刪除此列表中的前三個元素,你可以做到這一點是這樣的::

for /F "tokens=3*" %%a in ("%dirs%") do set dirs=%%b 

你可以從一個子程序的參數,這樣創建這個列表

另一種可能性是,目錄傳遞給子程序作爲參數列表

call :subroutine directoryA directoryB directoryC directoryD directoryE directoryF 

我認爲這是基於你的例子。在這種情況下,它是很容易通過三個shift命令「刪除」的前三個參數:

:subroutine 
rem Remove first three parameters: 
shift 
shift 
shift 
rem Process the rest of parameters: 
:nextParam 
    if "%1" equ "" goto endParams 
    echo Next param is: %1 
    shift 
goto nextParam 
:endParams 

但是,如果你有一個「真實」的陣列(即從1開始的數字標),其也可以從參數列表(在你的例子一樣)創建了一個子程序中這樣說:

set paramCount=0 
for %%x in (%*) do (
    set /A paramCount+=1 
    set "dirs[!paramCount!]=%%x" 
) 

那麼你可能會刪除前三個元素是這樣的:

for /L %%i in (4,1,%paramCount%) do (
    set /A j=%%i-3 
    set dirs[!j!]=!dirs[%%i]! 
) 
set /A paramCount-=3 
+0

這篇文章非常翔實,謝謝。我本來應該回去一點。我從我的java程序調用這個批處理文件。我使用Java API爲Runtime.getRuntime()。exec()方法提供的「commands []」數組傳遞了許多字符串作爲參數。每個目錄都作爲參數傳入。然後我訪問這些參數並使用它們來設置局部變量,我可以在後面的腳本中使用它們。我希望這會清理一些事情。 – DerStrom8