Windows CMD - выражение кода как значение переменной массива, не работающей для команды IF - PullRequest
2 голосов
/ 07 июля 2019

Я хочу создать автоматизированный массив тестирования в Команде Windows, используя одну инструкцию кода в качестве ЗНАЧЕНИЯ для каждой записи массива тестирования. Вот как выглядит определение массива для первых двух записей в массиве $ code_test [xx]:

set $code_test[00]=if 5 lss 10 (echo IT WORKED)
set $code_test[01]=if 5 lss 10 (echo BUG OFF)

Я хочу выполнить VALUE каждой записи массива $ code_test [xx] (которая является оператором тестового кода), используя цикл for /l следующим образом:

for /l %%g in (0,1,1) do (
    echo $code_test[0%%g]
    !$code_test[0%%g]!
    echo.
)

Полный код:

@echo off
setlocal enabledelayedexpansion

set $code_test[00]=if 5 lss 10 (echo IT WORKED)
set $code_test[01]=if 5 lss 10 (echo BUG OFF)

for /l %%g in (0,1,1) do (
    echo $code_test[0%%g]
    !$code_test[0%%g]!
    echo.
)

echo.
pause

Когда я выполняю полный код, я получаю следующее сообщение об ошибке при выполнении строки кода !$code_test[0%%g]!:

«если» не распознается как внутренняя или внешняя команда, работоспособна программа или командный файл

Я прочитал отличную статью здесь о том, как анализируется команда IF, но я не вижу ничего, что выскакивает из-за того, почему мой код дает сбой. Можно ли даже сделать то, что я пытаюсь сделать?

Любая помощь приветствуется!

UPDATE: Я обнаружил, что @sst является правильным, когда я использовал команду set в строке кода set $code_test[01]=if 5 lss 10 (set /a $var1+=1) :

@echo off

setlocal enabledelayedexpansion

set $var1=0
set $code_test[00]=if 5 lss 10 (echo IT WORKED)
set $code_test[01]=if 5 lss 10 (set /a $var1+=1)

for /l %%g in (0,1,1) do (
    echo $code_test[0%%g]
    cmd /c !$code_test[0%%g]!
    echo $var1 = !$var1!
    echo.
)

echo.
pause

Команда set /a $var1+=1 не увеличила значение $ var1, как ожидалось. Фактически, он помещает «1» перед меткой $ var1, когда выполняется строка кода echo $var1 = !$var1!. Я еще не пробовал решение, предлагаемое @Magoo. Я действительно хотел бы использовать решение cmd /c вместо вызова подпрограммы. Могу ли я что-нибудь сделать, чтобы команда set работала с опцией cmd /c?

Ответы [ 3 ]

4 голосов
/ 07 июля 2019

Он не может работать так, как вы пытались, потому что команда IF обнаружена и обработана на этапе 2.
Но с отложенным расширением уже слишком поздно.
Эта проблема возникает только для команд IF, FOR и REM.

´CALL %% $ code_test %% `работает во многих случаях, но не работает также для трех команд и для блоков кода.
Непонятно, почему в этом случае происходит сбой, так как команды анализируются на этапе 2, но они не распознаются.

Решение @stephan использует новый экземпляр cmd, у него есть недостаток - потерять все изменения переменных каждый раз, когда экземпляр cmd завершается.

Поэтому решение @Magoo использует процентное расширение, которое должно работать почти во всех случаях без проблем.

3 голосов
/ 07 июля 2019
@echo off
setlocal enabledelayedexpansion

set $code_test[00]=if 5 lss 10 (echo IT WORKED)
set $code_test[01]=if 5 lss 10 (echo BUG OFF)

for /l %%g in (0,1,1) do (
    SET "$code_test=!$code_test[0%%g]!
    CALL :test_code
    echo.
)

echo.
GOTO :EOF

:test_code
%$code_test%
GOTO :eof

Другой подход.

2 голосов
/ 07 июля 2019

вам, кажется, нужен еще один слой для разбора:

@echo off
setlocal enabledelayedexpansion
set $code_test[00]=if 5 lss 10 (echo IT WORKED)
set $code_test[01]=if 5 lss 10 (echo BUG OFF)
for /l %%g in (0,1,1) do (
    echo $code_test[0%%g]
    cmd /c !$code_test[0%%g]!
    echo.
)

Редактировать (только для полноты):
нашел другой способ сделать это (без подпрограммы):

@echo off
setlocal enabledelayedexpansion
set $code_test[00]=if 5 lss 10 (echo IT WORKED)
set $code_test[01]=if 5 lss 10 (echo BUG OFF)
for /l %%g in (0,1,1) do (
    echo $code_test[0%%g]
    for /f "delims=" %%a in ('%%$code_test[0%%g]%%') do @set "result=%%a"
    echo !result!
    echo.
)

Хитрость в том, что for выполняет ('...') часть в отдельном cmd процессе (как cmd /c ...), но записывает вывод в основной процесс.

Работает как с !$code_test[0%%g]!, так и с %%$code_test[0%%g]%%.

Хотя он не работает с if 5 lss 10 (set result=IT WORKED), потому что нет выходных данных для захвата (set выполняется только с предложением do).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...