Доступ к индексам массива через переменную - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь создать меню, которое позволяет пользователю развернуть папку для пакетного копирования и синхронизации c файлов. Однако мне сложно получить доступ к значениям массива по индексам, которые вводит пользователь. В for l oop они отображаются нормально, и похоже, что они правильно записаны в массиве.

Но когда я пытаюсь установить их или вывести их позже, я не получаю правильный вывод.

Не уверен, что я здесь не так делаю.

: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

структура папок

cmd


Хорошо, поэтому, основываясь на отзывах, я сделал несколько обновлений в коде. Теперь я уверен, что имена папок правильно хранятся в индексе массива. Я легко могу увидеть это, жестко закодировав индекс.

Итак, echo Folder0 !folderName[0]! возвращает имя первой папки и т. Д. c.

Однако после изменения

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

to

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

Я получаю пробел после номера индекса. Ex. (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!\"

changes

Ответы [ 2 ]

1 голос
/ 11 марта 2020

вы должны использовать отложенное расширение (! Расширение!). Заменить:

set folderName[%ID%]=%%a

на

set folderName[!ID!]=%%a

Для доступа к переменной вне назначенной ей l oop, Для отдельных элементов, используйте индексный номер.

echo Folder0 %folderName[0]%

Альтернативно, чтобы получить доступ ко всему массиву, вы можете использовать For / L l oop, например, так:

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

И, наконец, при увеличении переменной с помощью Set /A необходимо ссылаться на себя:

Set /A ID+=1 Достаточно.

0 голосов
/ 11 марта 2020

Наконец-то разобрался. Код ниже.

: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!^) %%a
        set /A ID=ID+1
    )
    echo.
    echo Please, select an assembly
    SET /P "selection=Input>"
    echo !selection!

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


    pause

    if exist "\\test\proj\dpa3\EXTERIOR\VCSE DVA Sync\%programNameAndYear%\!assemblyName!\" (
        Pushd  "\\test\proj\dpa3\EXTERIOR\VCSE DVA Sync\%programNameAndYear%\!assemblyName!\"
        echo exists
        dir /b /ad
    ) else (
        echo This folder does not exist on the shared drive
    )

)
endlocal
REM pause
popd
exit /b
...