Согласно сообщению Как интерпретатор сценариев Windows Command Interpreter (CMD.EXE) анализирует? (см. Этап 5), строка echo !!CLs[!count!]!!
не может работать, потому что отверстие !!
свернуто доодин !
, затем !CLs[!
расширяется до пустой строки (при условии, что такая переменная не определена), затем count
возвращается буквально, затем !]!
расширяется до пустой строки, а конечный !
равенуволен. Или, другими словами, отложенное расширение не может быть вложенным.
Вы можете использовать call
, хотя для введения другой фазы синтаксического анализа, например:
call echo %%CLs[!count!]%%
Линия IF NOT %%I == CLs[!count!] ( ... )
неверна, вы также должны расширить правильное значение. Однако call if
, к сожалению, не поможет, потому что if
(например, for
и rem
) - это специальная команда, которая распознается синтаксическим анализатором раньше других, например call
.
ToЧтобы обойти это, вы можете сохранить значение !count!
в метапеременной for
, например, %%J
, чтобы ввести другую фазу синтаксического анализа, и затем использовать !CLs[%%J]!
, вот так:
set /A "count=0"
for /F "tokens=5" %%I in ('some command') do (
for %%J in (!count!) do (
echo !CLs[%%J]!
if not "%%I" == "!CLs[%%J]!" (
set /A "count+=1"
set "CLs[!count!]=%%I"
)
)
)
Еще одна более медленная возможность - вставить соответствующий код в подпрограмму:
set /A "count=0"
for /F "tokens=5" %%I in ('some command') do (
call :SUB !count!
)
goto :EOF
:SUB
echo !CLs[%~1]!
if not "%%I" == "!CLs[%~1]!" (
set /A "count+=1"
set "CLs[%~1]=%%I"
)
goto :EOF
Вы также можете взглянуть на сообщение Массивы, связанные списки и другие структуры данных в сценарии cmd.exe (пакетная обработка) о том, как обращаться с такими псевдо-массивами.