2013-12-21 79 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