我在批处理文件中有一个数组,其中包含多个文件目录。我想删除数组的前三个元素并使所有内容都移位(即第四个元素代替第一个元素,第五个元素代替第二个元素,第六个元素代替第三个元素,等等)。这是可以在批处理脚本中完成的吗?
示例:
[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 :(得分:2)
我能想到的最好的方法就是拥有两个“数组”,一个用于数据,另一个用于数据当前是否有效。下面的示例代码创建一个dirs
“数组”,其中包含任何命令行参数和另一个valid
“数组”,然后仅打印来自dirs
的“有效”数据。
valid[i]
中的数据有效时, 1
将等于dirs[i]
。 <{1}}中的任何其他值都表示要忽略valid[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]!)
)
答案 1 :(得分: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