Пакетное присвоение значения массива переменной - PullRequest
1 голос
/ 11 октября 2019

У меня есть этот код:

@echo off
SET /a counter=0
SET _inputname=
Set interfejs=ala
FOR /f "skip=3 tokens=*" %%a in ('netsh int ip show interfaces') do ( call :myfunct "%%a" )

SET /P _inputname=interface: 
IF "%_inputname%" LEQ "%counter%" IF "%_inputname%" GTR "0" (
echo variable value:%_inputname%
call echo [%_inputname%] %%NetInterfNames[%_inputname%]%%

rem problem with assigning array value to a variable.

Set interfejs=%%NetInterfNames[%_inputname%]%%
echo to jest wybrany interface: %interfejs%

Rem split string
rem for /F "tokens=1,*" %%a in ("hello how are you") do echo %%b

)   
IF "%_inputname%" GTR "%counter%" ( GOTO :EOF )
IF "%_inputname%" EQU "0" ( GOTO :EOF )

    goto: EOF

:myfunct
set /a counter=%counter%+1
set NetInterfNames[%counter%]=%~1
call echo [%counter%] %%NetInterfNames[%counter%]%%

Внутри я пытаюсь присвоить значение, взятое из массива, переменной, используя это

Установить interfejs = %% NetInterfNames [%_inputname%] %%

Проблема в том, что массив значений не назначен. У кого-нибудь есть идеи, что с этим делать?

Ответы [ 2 ]

1 голос
/ 11 октября 2019

И здесь без включения отложенного расширения, чтобы показать вам, что вам нужно использовать дополнительные Call, в соответствии с моим прокомментированным советом. (я добавил Pause, чтобы вы могли видеть любой вывод) :

@Echo Off
Set "counter=0"
Set "_inputname="
Set "interfejs=ala"
For /F "Skip=3 Tokens=*" %%A In ('NetSh int ip show interfaces') Do Call :myfunct "%%A"

Set /P "_inputname=interface: "
If "%_inputname%" LEq "%counter%" If "%_inputname%" Gtr "0" (
    Echo variable value:%_inputname%
    Call Echo [%_inputname%] %%NetInterfNames[%_inputname%]%%

    Rem no problem with assigning array value to a variable.

    Call Set "interfejs=%%NetInterfNames[%_inputname%]%%"
    Call Echo to jest wybrany interface: %%interfejs%%

    Rem split string
    Rem For /F "Tokens=1*" %%A In ("hello how are you") Do Echo %%B

)
If "%_inputname%" Gtr "%counter%" GoTo :EOF
If "%_inputname%" Equ "0" GoTo :EOF

Pause&GoTo :EOF

:myfunct
Set /A counter+=1
Set "NetInterfNames[%counter%]=%~1"
Call Echo [%counter%] %%NetInterfNames[%counter%]%%

Однако если вы переместите две из ваших команд If, вы можете полностью отменитьПотребность в одном из блоков кода:

@Echo Off
Set "interfejs=ala"

Set "counter=0"
For /F "Skip=3 Tokens=*" %%A In ('NetSh int ip show interfaces') Do Call :myfunct "%%A"

Set "_inputname="
Set /P "_inputname=interface: "
If Not Defined _inputname GoTo :EOF
If "%_inputname%" Gtr "%counter%" GoTo :EOF
If "%_inputname%" Equ "0" GoTo :EOF
Echo variable value:%_inputname%
Call Echo [%_inputname%] %%NetInterfNames[%_inputname%]%%
Call Set "interfejs=%%NetInterfNames[%_inputname%]%%"
Echo to jest wybrany interface: %interfejs%

Rem split string
Rem For /F "Tokens=1*" %%A In ("hello how are you") Do Echo %%B

Pause&GoTo :EOF

:myfunct
Set /A counter+=1
Set "NetInterfNames[%counter%]=%~1"
Call Echo [%counter%] %%NetInterfNames[%counter%]%%

Вы, вероятно, тоже могли бы немного улучшить, но без включения отложенного расширения:

@Echo Off
For /F "Delims==" %%A In ('Set NetInterfNames[ 2^>NUL')Do Set "%%A="
For /F "Tokens=1* Delims=:" %%A In (
    'NetSh int ip show interfaces 2^>NUL^|Findstr "[0-9]"^|FindStr /N "^"'
)Do Set "NetInterfNames[%%A]=%%B"&Call Echo [%%A] %%NetInterfNames[%%A]%%
:Input
Set /P "_inputname=interface: "
If Not Defined NetInterfNames[%_inputname%] GoTo Input
Call Set "_interfejs=%%NetInterfNames[%_inputname%]%%"
Echo to jest wybrany interface: %_interfejs%

Rem split string
Rem For /F "Tokens=1*" %%A In ("hello how are you") Do Echo %%B

Pause&GoTo :EOF

Или с отложенным расширением:

@Echo Off
SetLocal EnableDelayedExpansion
For /F "Delims==" %%A In ('Set NetInterfNames[ 2^>NUL')Do Set "%%A="
For /F "Tokens=1* Delims=:" %%A In (
    'NetSh int ip show interfaces 2^>NUL^|Findstr "[0-9]"^|FindStr /N "^"'
)Do Set "NetInterfNames[%%A]=%%B"&Echo [%%A] !NetInterfNames[%%A]!
:Input
Set /P "_inputname=interface: "
If Not Defined NetInterfNames[%_inputname%] GoTo Input
Set "_interfejs=!NetInterfNames[%_inputname%]!"
Echo to jest wybrany interface: %_interfejs%

Rem split string
Rem For /F "Tokens=1*" %%A In ("hello how are you") Do Echo %%B

Pause&GoTo :EOF
0 голосов
/ 11 октября 2019

Если вы enabledelayedexpansion, это поможет вам достичь этого гораздо проще.

@echo off
setlocal enabledelayedexpansion
SET /a counter=0
SET _inputname=
Set interfejs=ala
FOR /f "skip=3 tokens=*" %%a in ('netsh int ip show interfaces') do call :myfunct "%%~a"

SET /P _inputname=interface: 
IF %_inputname% LEQ %counter% IF %_inputname% GTR 0 (
echo variable value:%_inputname%
echo [%_inputname%] !NetInterfNames[%_inputname%]!

Set interfejs=!NetInterfNames[%_inputname%]!
echo to jest wybrany interface: !interfejs!

)   
IF %_inputname% GTR %counter% GOTO :EOF
IF %_inputname% EQU 0 GOTO :EOF

    goto :eof

:myfunct
set /a counter+1
set NetInterfNames[%counter%]=%~1
call echo [%counter%] !NetInterfNames[%counter%]!
...