batch-file - cmd.exe 批处理文件中意外处理 "variables"

标签 batch-file variables cmd

我有一个包含以下内容的 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

这是为什么呢?有没有办法让它按照我的想法行事?

最佳答案

() 之间的所有内容都被解析为一行(使用 & 连接命令) – 以及 shell expands %var% variables at parse time

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%

...但这就是疯狂。例如,如果您想在延迟扩展模式下回显 !,则必须 escape it twice :

echo hi^^!

(这会被解析两次,第一次减少为 echo hi^!。)甚至不让我开始使用 ^ 内部变量。


考虑一种不太笨拙的语言(Perl、Python、PowerShell、PHP、JScript、C#...)

关于batch-file - cmd.exe 批处理文件中意外处理 "variables",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4908595/

相关文章:

command-line - Windows CMD : Get relative path from absolute path

file - 两个时间戳之间的文件列表

python - 如何在Python中基于变量值创建字典

linux - 定义每次使用时要评估的 bash 变量

java - Java 中的对象命名和继承

Windows 命令 : how do I push current directory using chdir for popping later?

windows - 批量删除文本文件中的一行?

windows - 有关在Windows应用程序中可能替换批处理文件的问题?

java - 设置System.setOut();到命令提示符

mysql只导入缺失的行