首页 > 解决方案 > 通过变量访问数组索引

问题描述

我正在尝试创建一个菜单,允许用户深入到文件夹中以批量复制和同步文件。但是,我很难在用户输入的索引处访问数组值。在 for 循环中,它们显示良好,因此看起来它们在数组中被正确捕获。

但是当我稍后尝试设置它们或回显它们时,我没有得到正确的输出。

不知道我在这里做错了什么。

:DirectoryContents
setlocal EnableDelayedExpansion
if exist "\\test\proj\dpa3\EXTERIOR\VCSE DVA Sync\%programNameAndYear%" (
    echo The sub-folders in this folder on the share drive are: 
    echo.
    Pushd  "\\test\proj\dpa3\EXTERIOR\VCSE DVA Sync\%programNameAndYear%"
    REM dir /b /ad
    set /a ID=0

    for /d %%a in (*) do (
        set folderName[%ID%]=%%a
        echo (!ID!^) %%folderName[%ID%]%%
        set /a ID=ID+1
    )
        echo.
    echo Please, select an assembly
    SET /P "selection=Input>"
    SET assemblyName=!folderName[%selection%]!
    echo assemblyName !assemblyName!

    call echo Folder0 !folderName[%0%]!
    call echo Folder1 !folderName[%1%]!
    call echo Folder2 !folderName[%2%]!

    echo test !folderName[%selection%]!
    call echo test2 %%folderName[%selection%]%%

    pause


    echo This folder does not exist on the shared drive

)
endlocal
REM pause
popd
exit /b

文件夹结构

命令


好的,所以根据反馈我对代码进行了一些更新。我现在确信文件夹名称已正确存储在数组索引中。通过对索引进行硬编码,我可以很容易地看到这一点。

所以echo Folder0 !folderName[0]!返回第一个文件夹的名称等。

不过改了之后

set folderName[%ID%]=%%a
echo (!ID!^) %%folderName[%ID%]%%

to

set folderName[!ID!]=%%a
echo (!ID!^) %folderName[!ID!]%

我在索引号后得到一个空白。前任。(1)

也未设置 assemblyName 变量。

我试过了

    SET assemblyName=!folderName[%selection%]!
    call echo assemblyName !assemblyName!

and

    SET assemblyName=%folderName[!selection!]%
    call echo assemblyName !assemblyName!

两者都返回空白。

最终我要做的是使用网络路径中的 assemblyName 变量来访问该文件夹。

Pushd  "\\test\proj\dpa3\EXTERIOR\VCSE DVA Sync\%programNameAndYear%\!assemblyName!\"

变化

标签: arraysbatch-file

解决方案


您应该使用延迟扩展(!扩展!)。代替:

set folderName[%ID%]=%%a

set folderName[!ID!]=%%a

要访问分配给它的循环之外的变量,对于单个元素,请使用索引号。

echo Folder0 %folderName[0]%

或者,要访问整个数组,您可以使用 For /L 循环,如下所示:

For /L %%A in (0,1,%ID%) do (Echo(!folderName[%%A]!)

最后,当使用 增加变量时Set /A,它确实需要引用自身:

Set /A ID+=1 就足够了。


推荐阅读