Неожиданная обработка «переменных» в командном файле cmd.exe - PullRequest
2 голосов
/ 04 февраля 2011

У меня есть xyz.bat файл с этим содержимым:

@set val=one
@if "%val%" equ "one" (
   @set val=yes
   echo val after setting it: %val%
) else (
   @set val=no
)
@echo %val%

Запуск его с cmd.exe отпечатками

val after setting it: one
yes

, но я ожидал

val after setting it: yes
yes

Почему это?И есть ли способ заставить его вести себя так, как мне кажется?

1 Ответ

6 голосов
/ 04 февраля 2011

Все между ( и ) анализируется как одна строка (объединяя команды с &) - и оболочка раскрывает %var% переменных во время разбора

Вывод set /? объясняет это далее.

В последних версиях:

@echo off
setlocal enabledelayedexpansion
set var=one
if a equ a (
    set var=two
    echo immediate expansion: %var%
    echo delayed expansion:   !var!
)
echo after: %var%

... но этот путь лежит безумием. Например, если вы хотите повторить ! в режиме отложенного расширения, вы должны дважды его избежать :

echo hi^^!

(Это анализируется дважды, в первый раз уменьшается до echo hi^!.) И даже не начинайте использовать ^ внутри переменных.


Рассмотрим менее сложный язык (Perl, Python, PowerShell, PHP, JScript, C #, ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...