我编写了以下批处理文件:
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
,然后将输出的多个路径存储到数组中,我需要这样做,因为以后需要处理这些路径。到目前为止,出于测试目的,我调用了脚本的后半部分只是为了确保数组正常工作。
答案 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]!
根据Aacini在comment中的建议,您可以通过将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[
返回它们按字母顺序排序,其中顺序为0
,1
,{ {1}},10
,...,11
等,因此,一旦索引中的位数超过一位,该顺序就会变得混乱; 2
或Paths[invalid]
,它们也会被返回;