xcopy копирует файлы в каталог из переменной в пакетном файле [duplicate]

Первая - инициализация , а вторая - назначение . Поскольку массивы не являются изменяемыми значениями в C, вы не можете назначать им новые значения.

Помните, вы можете изменить содержимое массива, вы просто не можете сказать fast_car = .... Таким образом, содержимые модифицируемые, массивы сами по себе не являются.

<ч>

Используя тот же символ = для этих самых различных концепций дискуссионных стоимостей.

12
задан Lankymart 26 April 2017 в 15:58
поделиться

1 ответ

Вы не первый, кто попал в знаменитую «задержанную ловушку расширения» (и вы не станете последним)

Вам нужно задержать расширение, если вы хотите использовать переменную, что вы изменен в том же блоке (блок представляет собой последовательность команд в скобках ( и ))

Отложенные переменные ссылаются на !var! вместо %var%

Причина в том, что cmd анализирует код. Полная строка или блок анализируется сразу, заменяя обычные переменные своим значением во время разбора. Отложенные переменные оцениваются во время выполнения.

Две простые партии для демонстрации:

setlocal enabledelayedexpansion
set "var=hello"
if 1==1 (
  set "var=world"
  echo %var% !var!
)

.

setlocal enabledelayedexpansion
for /L %%i in (1,1,5) do (
  echo %random% !random!
)

Примечание: также строка рассматривается как block:

set "var=old"
set "var=new" & echo %var% 

с задержкой расширения:

setlocal enabledelayedexpansion
set "var=old"
set "var=new" & echo !var! 

Отсроченное расширение по умолчанию отключено в командной строке. Если вам это действительно нужно, вы можете сделать:

cmd /v:on /c "set "var=hello" & echo !var!"

Также есть способ сделать то же самое без задержки расширения (но call стоит некоторое время, поэтому он медленнее, но если по какой-то причине вы не можете / не хотите использовать замедленное расширение, это альтернатива):

setlocal DISabledelayedexpansion
for /L %%i in (1,1,5) do (
  call echo %random% %%random%% 
)

Оба метода могут использоваться для отображения переменных типа массива :

setlocal ENabledelayedexpansion
set "num=4"
set "var[%num%]=hello"
echo !var[%num%]!

или

setlocal DISabledelayedexpansion
set "num=4"
set "var[%num%]=hello"
call echo %%var[%num%]%%

(этого часто задают как «переменная, которая содержит другую переменную» или «вложенные переменные»

22
ответ дан Stephan 15 August 2018 в 16:38
поделиться
  • 1
    Это здорово, если бы вы могли добавить немного больше деталей :) – Nayana Adassuriya 14 June 2015 в 03:57
  • 2
    @NayanaAdassuriya: большинство людей не любят читать о техническом фоне или даже о расширенных технических материалах – Stephan 14 June 2015 в 06:46
  • 3
    Привет @Stephan. Возможно, добавление использования CALL и удвоение процентных символов в переменной будет хорошим дополнением к этому ответу. Я часто использую этот вопрос как дубликат для закрытия вопросов. – Squashman 20 June 2018 в 21:49
  • 4
    @Squashman: звучит неплохо. Готово. Не стесняйтесь исправить / украсить, я буду в сети в течение нескольких дней ... – Stephan 21 June 2018 в 20:31
Другие вопросы по тегам:

Похожие вопросы: