if-statement - Windows 批处理 if 语句受 if 块中的语句影响
问题描述
当我在 Windows Server 2012 上执行以下 Windows 批处理脚本时:
@echo off
SET v=()
IF 1 == 2 (
echo hi
echo %v:~0%
echo 1 equals 2
) ELSE (
echo 1 does not equal 2
)
IF 1 == 2 (
echo %v:0%
echo 1 equals 2
) ELSE (
echo 1 does not equal 2
)
我得到以下输出:
1 equals 2
1 does not equal 2
1 does not equal 2
谁能告诉我为什么会这样?echo hi
即使 v 的值为 (),我也不想进入以 开头的块。
解决方案
我不太确定您的意图是什么,但这是我认为可以解决您的问题的方法。
该变量%v%
在命令运行之前被解析IF
,并且包含有问题的右括号。因此发生的事情是代码读取,echo %v:~0%
asecho (
并关闭IF
with)
它然后解析下一行是echo 1 equals 2
,并按预期打印它。
为防止这种情况,请在定义该变量时转义该括号:
@echo off
SET "v=(^)"
IF 1 == 2 (
echo hi
echo %v:~0%
echo 1 equals 2
) ELSE (
echo 1 does not equal 2
)
IF 1 == 2 (
echo %v:0%
echo 1 equals 2
) ELSE (
echo 1 does not equal 2
)
或者,最好还是启用延迟扩展,以便在命令运行之前不解析变量内容,只有当它是:
@echo off
SET "v=()"
setlocal enabledelayedexpansion
IF 1 == 2 (
echo hi
echo !v:~0!
echo 1 equals 2
) ELSE (
echo 1 does not equal 2
)
IF 1 == 2 (
echo !v:0!
echo 1 equals 2
) ELSE (
echo 1 does not equal 2
)
推荐阅读
- python - 我是否必须在同一范围内调用 py::initialize_interpreter() 和 py::finalize_interpreter() ?
- c# - SignalR 在服务器上获取不记名令牌
- icc - 安装 Intel oneAPI 后找不到 icc 编译器,在 Ubuntu 20 上从 bash 调用
- php - PHP Slim v3 post 方法 405(使用 POSTMAN 测试!)
- oracle - 防止 FAST_PCT mview 刷新
- google-cloud-build - PROJECT_ID env 和 Secret Manager 访问
- sql - 聚合函数(MAX 等)返回 NULL 而不是没有行
- sql - 什么是正确的查询?
- css - 为什么 Sass 使用嵌套媒体查询不尊重 CSS 属性的顺序?
- python - python / plotly(express)中的堆积条形图:条形的分组/排序