Пакетный способ доступа к массиву - PullRequest
1 голос
/ 27 сентября 2019

Это мой скрипт:

@echo off
setlocal EnableDelayedExpansion
set "memuc=d:\file.exe"

set array[0]=foo
set array[1]=bar

set x=0


:SymLoop
if defined array[!x!] (
    call "!memuc!" start -n !!array[%x%]!!

    set /A x=!x! + 1
    GOTO :SymLoop
)

endlocal
  1. Почему строку array[!x!] нельзя заменить на !array[%x%]!?Я думал, что должен использовать ! при доступе к delayedExpansion переменным.
  2. Почему я должен использовать %x% вместо !x! ?.То же самое, я думал, ! должен быть необходим доступ к x переменная
  3. Почему я должен использовать два ! здесь !!array[%x%]!!?

1 Ответ

1 голос
/ 27 сентября 2019

Я думаю, что вы неправильно поняли концепцию.! означает, что значение переменной будет расширено как можно позже.

@echo off
SETLOCAL EnableDelayedExpansion
set "_var=stackoverflow"
set "_var=rules" & echo "%_var% !_var!"

Это напечатает "stackoverflow rules" из-за факта отложенного расширения.

Теперь на ваши вопросы:

Addum 1. Причина в if defined.Если вы хотите поместить туда фактическую переменную, которую вы используете, например, ваш array[0], именно поэтому у вас есть array[!x!], а не !array[%x%]!.

Addum 2. Youнеобходимо использовать %x% для немедленного расширения, так как вы хотите иметь array[0] и array[1].Если вы напишите это как !x!, то вы будете искать, если написано как %array[!x!]% для array[!x!].

Addum 3. Двойные восклицательные знаки (!!)это связано с тем, что call вводит еще одно расширение.Итак, сначала у вас есть немедленное расширение %x%, затем у вас есть расширение array[0], а затем расширение для call.

...