在批处理文件中循环“数组”以移动元素

时间:2013-12-21 00:59:22

标签: arrays batch-file for-loop shift delayedvariableexpansion

我有一个批处理文件,它以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%]!。如您所见,我已启用延迟扩展。但是,对于模拟数组中元素的list [...]变量,需要!!但是,我认为我还需要对“新”使用延迟扩展。在这种情况下我该怎么办?或许这不是实际问题? “旧”和“新”变量正确递增,但echo !list[%old%]!行每次都返回相同的值。我希望在那一行中存在同样的问题,“旧” - 应该有!围绕它,但是!已经被用作列表变量。那么如果你需要在声明中嵌套!会发生什么?谢谢你的帮助!

1 个答案:

答案 0 :(得分: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

这应该适合你 - 简单的方法和艰难的方式。