Я думаю, что вы неправильно поняли концепцию.!
означает, что значение переменной будет расширено как можно позже.
@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
.