Пакетное замедленное расширение не работает

Хорошо, я схожу с ума, и я не знаю, что еще делать, я попробовал несколько вещей, и ничего не работает.

Посмотрите на этот пример кода (test.cmd):

setlocal enabledelayedexpansion enableextensions
set VAR=before
if "%VAR%" == "before" (
    set VAR=after;
    if "%VAR%" == "after" @echo If you see this, it worked
)

Это сгенерированный вывод:

D:\>ver

Microsoft Windows [Version 6.1.7600]

D:\>test.cmd

D:\>setlocal enabledelayedexpansion enableextensions

D:\>set VAR=before

D:\>if "before" == "before" (
set VAR=after;
 if "before" == "after"
)

D:\>

Я делаю что-то неправильно?

Это всего лишь тест, код, который мне нужен, тоже использует переменные и требует отложенного расширения, но этот простой тест тоже не работает, другой тоже не сработает (я пытался, я закончил с простым примером, чтобы проверить, работает ли он).

РЕДАКТИРОВАТЬ: новый код и вывод:

test.cmd:

@echo off
setlocal enabledelayedexpansion enableextensions
set VAR=before
if "%VAR%" == "before" (
   set VAR=after;
   if "!VAR!" == "after" (
      echo It worked.
   ) else (
      echo It didn't work.
   )
)

Выход:

D:\>test.cmd
It didn't work.

D:\>

4 ответа

Решение

Вы должны использовать !var! для отложенного расширения. %var% всегда расширяется на этапе разбора.

Т.е. измени свой код на

setlocal enabledelayedexpansion enableextensions
set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

В начале командной строки cmd необходимо ввести "CMD /V" ИЛИ "CMD /V:ON"

После этого тестирования код должен работать

SETLOCAL EnableDelayedExpansion
Set "_var=first"
Set "_var=second" & Echo %_var% !_var!

Вы должны увидеть вывод "первая секунда" образец экрана подсказки cmd

Не используйте ==, в пакете вы должны использовать EQU

Например напишите:

if %bla% EQU %blub% echo same

Я нашел твою проблему.

set VAR=after;

удалять ; из кода выше

Другие вопросы по тегам