2010-09-21 18:44:45 +0000 2010-09-21 18:44:45 +0000
34
34

在DOS批量脚本中填充数组

如何在DOS批处理脚本中设置一个数组变量?我想用一个要处理的文件名列表来加载它。我真的希望尽可能地保持简单。谢谢你。

答案 (12)

48
48
48
2010-09-21 20:58:31 +0000

我想明白了。

set FILE_LIST=(file1.dll file2.exe file3.dll file4.dll file5.dll)

set BIN_PATH="C:\Program Files\My App Folder\bin"
set BAK_PATH="C:\Program Files\My App Folder\bin\Backups"
set DEV_PATH="C:\My Dev Path\bin\Debug"

for %%i in %FILE_LIST% do copy %BIN_PATH%\%%i %BAK_PATH%
for %%i in %FILE_LIST% do copy %DEV_PATH%\%%i %BIN_PATH%

我几年前也做过这样的事 所以花了点时间去想办法 (顺便说一句,我讨厌重新发明轮子。)现在发在这里,希望别人也会觉得有用。

13
13
13
2013-02-18 23:27:03 +0000

是的,你可以在批处理中做数组。虽然它们并不完全像C或VB中的数组,但你可以做到。

@echo off
setlocal enabledelayedexpansion

set arrayline[0]=############
set arrayline[1]=#..........#
set arrayline[2]=#..........#
set arrayline[3]=#..........#
set arrayline[4]=#..........#
set arrayline[5]=#..........#
set arrayline[6]=#..........#
set arrayline[7]=#..........#
set arrayline[8]=#..........#
set arrayline[9]=#..........#
set arrayline[10]=#..........#
set arrayline[11]=#..........#
set arrayline[12]=############

::read it using a FOR /L statement
for /l %%n in (0,1,12) do (
echo !arrayline[%%n]!
)
pause
7
7
7
2010-09-21 20:48:19 +0000

来自Jakash3的博客,Array in Batch介绍了如何在命令提示符下模拟数组。

文章中包含了一个名为array.bat的批处理文件,它包含了一个用于处理数组的函数库。你需要选择文章中的文本并将其粘贴到bat文件中。

例如,下面的测试脚本。

@echo off
set book[0]=Avatar
set book[1]=The Green Mile
set book[2]=The Count of Monte Cristo
call array.bat add book Babo
call array.bat len book length
echo I have %length% books you can borrow.
echo Pick one:
echo.
echo 0) Avatar
echo 1) The Green Mile
echo 2) The Count of Monte Cristo
echo 3) Babo
echo.
set /p pick=
call array.bat getitem book %pick% title
echo.
echo You picked %title%.

产生以下输出。

4
4
4
2014-08-29 11:53:30 +0000

这将填充一个数组并打印出

你可以使用names1 names2 names3,而不是names[1] names[2] names[3],写names!i!而不是names[!i!]。它通过生成变量名来产生数组。批量中并没有数组结构。

@echo off
setlocal enabledelayedexpansion enableextensions

set i=-1

for %%f in (bob, tom, joseph) do (
 set /a i=!i!+1
 set names[!i!]=%%f
)
set lastindex=!i!

for /L %%f in (0,1,!lastindex!) do ( 
  echo !names[%%f]!
)

输出-

c:\blah>a
bob
tom
joseph

c:\blah>

一些解释-

用 !var!而不是%var%的setlocal enabledelayedexpansion enableextensions是必要的,以防止奇怪的行为,这样当变量在FOR或IF中时,就会有正确的行为。这是批处理文件的一个怪现象。参见set /?,这里会进一步提到。

这是填充数组的方法,对任何了解数组的人来说都是很直接的。你也可以用names[0]=bobnames[1]=tomnames[2]=joseph,不过数组的好处之一就是可以用循环来填充数组,我在这里就是这么做的。

for %%f in (bob, tom, joseph) do (
 set /a i=!i!+1
 set names[!i!]=%%f
)
set lastindex=!i!

这将显示数组。%%f 如果你呼应它,你会看到将从0到数组的最后一个索引,以1为单位,所以将打印 names[0] names[1] names[2]

for /L %%f in (0,1,!lastindex!) do ( 
  echo !names[%%f]!
)
0
0
0
2014-05-01 20:03:34 +0000

替换文本中的字符串和字母。

通过将文本扩展为for体并将var替换为var来尝试for循环。 通过调用set命令拖放文本文件,使%1为用户输入。

@echo off
setlocal EnableDelayedExpansion
set /p a= enter letter to change:
set /p b= letter to change to:
set /p input=<%1
for /f %%c in ("!input:~!") do (
set "code=!input:%a%=%b%!"
echo !code!>myfile.txt
)
0
0
0
2010-09-21 18:53:17 +0000

你不能在命令提示符中真正地进行数组处理(也不是真正的DOS,除非你运行的是Windows 3.1)。然而,你可以用 FOR命令进行基于集合的处理。

要创建要处理的文件列表,你可以手动创建一个要处理的文本文件,或者在FOR循环内使用dir /b <mask>命令。

我从FOR循环中学到的一些知识–你需要使用一个单一字符变量作为你的光标!

0
0
0
2010-09-21 19:42:14 +0000

对于你想做的事情,如何为每个文件名使用一个输入变量,你可以用%1%2等变量来获取,例如:mybat.bat file1.nam file2.nam等。

然后你可以在一个循环中使用这些变量,但只需要使用%1作为主要参数,因为你可以使用SHIFT把其他变量带到%1的 “位置",用IF "X%1” == “X”

eg:

:LOOP
IF "X%1" == "X" GOTO DONE
COPY %1 C:\TARGET.DIR
SHIFT
GOTO LOOP
:DONE
``` 这样的方式来测试null(变量的末端)。
0
0
0
2010-09-21 19:07:50 +0000

查看微软文档中的 FOR批处理命令。你可以使用FOR来遍历一组目录、一个目录中的文件,或者一个目录中的文件及其所有子目录。

默认情况下,FOR处理的是集合或只是文件。

FOR %f IN (*.txt) DO ECHO %f

或者,对于递归:

FOR /R %f IN (*.txt) DO ECHO %f

或者,对于仅仅是目录:

FOR /D %d DO ECHO %d

0x1&

0
0
0
2010-09-21 20:04:48 +0000

如果你把文件列表保存到filelist.txt中,你可以得到FOR来读取和处理文件的每一行,如

FOR /F "delims=|" %i IN (filelist.txt) DO @echo %i

来打印文件的每一行(直到行中的第一个"|“。如果你不指定自己的定界符,将使用空格和制表符,所以除非你的路径没有空格,否则你需要指定一个不会出现在文件中的字符来获得完整的行)。)

0
0
0
2016-08-16 12:37:34 +0000

这是一个小的调试文件,我做了一段时间的一个去测试te阵列从我的井字拖游戏在BATCH / CMD.它可以读取和写入一个数组和从一个数组whiteout去大和复杂的代码。

使用它很简单:

写入一个数组

1.给它一个文件或修改它以导入其他东西。 2. 给数组取个名字。 3. 然后你就完成了。

从一个数组中读取数据

1.给出你想读取的数组的大小或者部分数组。 2. 输入数组的名称,名称中包含%%a 3.然后你就完成了。

代码。

@echo off
setlocal EnableDelayedExpansion

set ID=0

:: Reader ::
:: It reads the file called input.txt ::
:: and stores it in a new variable that ::
:: for everytime it goes over it it is a ::
:: new ID (Slot in the array). ::

For /F %%A in (input.txt) do ( 
    set /a ID=ID+1
    set Input!ID!= %%A

    echo !ID! : %%A
)

:: Writer ::
:: this is to read all Slots in the array ::
:: and puts it on the screen. ::

for /L %%a in (1,1,!ID!) do (
    echo !Input%%a!
)
pause>nul
0
0
0
2010-09-21 20:11:25 +0000

在你对一个答案的评论中,你说,

我正在做开发工作,由于应用程序的复杂性质,每次要测试一个build(这是经常发生的),我必须把五个文件从build二进制目录复制到安装二进制目录。这就很繁琐了。现在,我把文件名硬编码到我的批处理脚本中,但我想把它们放到一个数组中,使脚本更容易维护。

我相信你要找的是一个Makefile,也可能是cygwin给你一个像样的shell(bash,或任何你喜欢的)。

0
0
0
2014-08-28 20:57:17 +0000

类似这样的批处理文件?在文件夹中选择一个文件。<<<<是注释,没有代码

:selectapk
SETLOCAL ENABLEDELAYEDEXPANSION << DELAYED EXPANSION on for counter in For loop
SET /A MAXITEM=0
Echo.
Echo Found these APK files in "add_apk_here" folder.
Echo.
For %%a in (add_apk_here/*.apk) do (
 Set /A MAXITEM+=1
 Set MENUITEM!MAXITEM!=%%a << Fill n local env vars, one for each file, called MENUITEM1...n
 Echo !MAXITEM!. %%a
)
Echo.
If !MAXITEM!==0 Echo No APK in "add_apk_here" folder & call :delay & Goto start << No apk files then go back
SET /P CHOICE=Select APK to work on: 
SET MENUITEM=!MENUITEM%CHOICE%! << Get the stored filename from MENUITEMx
SETLOCAL DISABLEDELAYEDEXPANSION << Very important for next ENDLOCAL that doesn't like the delayedexpansion var
ENDLOCAL & SET apk=%MENUITEM% << put the local MENUITEM var into the global apk var
goto start

:delay
REM %1 like Call :delay 5
SETLOCAL
SET N=%1
If Not Defined N Set N=2
Ping -n %N% -w 1000 127.255.255.255 > nul
ENDLOCAL
Exit /b