在cmd中将多个路径作为字符串存储在数组中

时间:2018-07-05 14:09:51

标签: batch-file cmd

我编写了以下批处理文件:

setlocal EnableDelayedExpansion
set integer=0
for /f "delims=" %%a in ('where /R C:\ /F python.exe') do (
    set Paths[!integer!]=%%a
    set /A integer+=1
)

for %%b in (%Paths%) do (
    echo %%b
)

这个想法是我想运行where /R C:\ /F python.exe,然后将输出的多个路径存储到数组中,我需要这样做,因为以后需要处理这些路径。到目前为止,出于测试目的,我调用了脚本的后半部分只是为了确保数组正常工作。

1 个答案:

答案 0 :(得分:1)

您的第二部分是错误的。由于批处理脚本中没有真正的数组,因此无法使用for循环,类似于其他语言中使用的for each element in array do之类的循环。有关详情,请参阅此帖子:Arrays, linked lists and other data structures in cmd.exe (batch) script

要遍历所有(伪)数组元素,可以改为执行以下操作:

set /A count=integer-1
for /L %%i in (0,1,%count%) do echo Paths[%%i] = !Paths[%%i]!

根据Aacinicomment中的建议,您可以通过将set /A integer+=1行向上移动到行的前面来将base-0更改为base-1(伪)数组。 set Paths[!integer!]=%%a在您的第一部分中,因此变量integer已经包含最大索引,这将导致第二部分稍微简单一些:

for /L %%i in (1,1,%integer%) do echo Paths[%%i] = !Paths[%%i]!

或者,您可以使用for /F循环来解析set Paths[的输出:

for /F "tokens=1* delims==" %%i in ('set Paths[ 2^> nul') do echo %%i = %%j

这可能是有益的:

  • 您不需要知道元素总数;
  • 索引不必相邻,甚至可以是非数字;

但是有两个警告:

  • (伪)数组元素相对于索引不以升序返回,因为set Paths[返回它们按字母顺序排序,其中顺序为01,{ {1}},10,...,11等,因此,一旦索引中的位数超过一位,该顺序就会变得混乱;
  • 如果存在以该名称开头的其他变量,例如2Paths[invalid],它们也会被返回;