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"
)
4

2 回答 2

3

我能想到的最好的方法是有两个“数组”,一个用于数据,另一个用于数据当前是否有效。下面的示例代码创建一个dirs包含任何命令行参数的“数组”和另一个valid“数组”,然后仅打印来自dirs.

valid[i]将等于1当且仅当数据dirs[i]有效时。in 中的任何其他值valid[i]都表示dirs[i]将忽略 in 中的数据。

@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
于 2013-11-15T01:47:03.943 回答
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
于 2013-11-15T03:52:50.730 回答