在 Windows 批处理编程中使用变量



我正在尝试在Windows批处理编程中做一些子字符串,但它似乎不像linux脚本那么容易。

这是我的代码片段。

set ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:Worksdownload -Dhello.type=DDDDD
set START_INDEX=34
set END_INDEX=51
SET newStr=%ENV_STRING:~%START_INDEX%,%END_INDEX%%

START_INDEX和END_INDEX将根据用户提供的ENV_STRING而变化。 我对START_INDEX和END_INDEX使用静态整数只是为了表明使用了这些变量。 我只想从ENV_STRING中提取hello.alt.dir的值。

当我打印出 newStr 时,它不会对字符串进行子串串。

有人可以指出哪个部分是错误的吗?

谢谢。

您可以使用以下代码:

@echo off
set "ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:Worksdownload - Dhello.type=DDDDD"
set "START_INDEX=34"
set "END_INDEX=51"
setlocal EnableDelayedExpansion
set "newStr=!ENV_STRING:~%START_INDEX%,%END_INDEX%!"
endlocal & set "newStr=%newStr%"

在变量引用中无法引用环境变量(如START_INDEXEND_INDEX)的值。Windows 命令解释器无法解释变量引用。

一种解决方案是对应用替换的变量使用延迟扩展,对开始和结束索引引用使用即时扩展,如上面的代码所示。

但是命令SETLOCAL创建当前环境变量的副本,因此在命令ENDLOCAL丢弃当前环境变量列表并恢复以前的变量列表后,环境变量newStr将不再存在。解决方案是使用ENDLOCALSET,并在一条线上立即进行变量扩展。

顺便说一句:字符串拆分通常是使用for /F在 Windows 批处理脚本中完成的。

尝试如下:

setlocal enableDelayedExpansion
set ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:Worksdownload -Dhello.type=DDDDD
set START_INDEX=34
set END_INDEX=51
SET newStr=!ENV_STRING:~%START_INDEX%,%END_INDEX%!
echo -%newStr%-

使用延迟扩展和用!括起来的变量,表达式将在执行时(即延迟)进行计算。而用%括起来的变量将立即被替换.因此,您可以避免%碰撞。

最新更新