【问题标题】:Dynamic variable syntax with delayed expansion具有延迟扩展的动态变量语法
【发布时间】:2018-03-06 11:23:05
【问题描述】:

为了重用代码,我尝试使用动态变量来测试条件,但无法获得所需的结果。我正在使用延迟扩展。

1    Outside the for loop:
2    set "H_HEADER=FALSE"
3    set "SUB_TRANSTYPE=#"
4    
5    Inside the for loop:
6    set "SUB_TRANSTYPE=!FULL_LINE:~0,1!"
7    if !SUB_TRANSTYPE!==H (
8      echo sub_transtype_header is !!SUB_TRANSTYPE!_HEADER!
9    )

第 6 行将 SUB_TRANSTYPE 设置为 H

第 8 行将 H_HEADER 打印到控制台,但我希望它打印 FALSE(H_HEADER 的值)

我弄乱了转义字符,但无法正常工作。救命!

【问题讨论】:

  • ……但这肯定更容易:If !SUB_TRANSTYPE!==H Echo sub_transtype_header is !H_HEADER!
  • 是的,但我试图重用我的代码,而不是使用 100 行带有静态变量的单独行。
  • 您和您接受的答案都使用了静态字符,HIf 比较的开头,因此无需使用变量来表示完全相同的已知静态字符同一行的结尾。
  • 这段代码只是一个更大函数的一部分,但是这部分是许多函数通用的部分。静态 H 是必要的,因为针对不同的事务类型执行某些其他操作。
  • If变量SUB_TRANSTYPE的字符串内容等于区分大小写的字符串字符H,那么就知道sub_transtype_header就是变量H_HEADER的字符串内容。请向我提供您现在拥有的不使用静态字符串字符 H 的行,并告诉我该“不同”比较字符串是如何得出的。

标签: windows loops batch-file delayedvariableexpansion


【解决方案1】:

第 6 行应该是:

set "SUB_TRANSTYPE=!FULL_LINE:~0,1!"

第 7 行应该是:

if !SUB_TRANSTYPE!==H (

第 8 行应该是:

for /F %%A in ("!SUB_TRANSTYPE!") do echo sub_transtype_header is !%%A_HEADER!

这种类型的管理在this answer有完整的描述。

【讨论】:

  • 谢谢,是的,你找到了我的错字。我会在原文中更正它们。正如 Magoo 所建议的那样, FOR 语句比 CALL 语句有什么好处吗?
  • 在链接的答案中有这样的解释:“实现上述过程的另一种方法是使用附加的 FOR 命令通过等效的可替换参数来更改索引的延迟扩展,并且然后对数组元素使用延迟扩展。此方法运行速度比以前的 CALL 快" 此外,您可以在 for 内放置一个 if 并直接完成比较,没有其他变量...
【解决方案2】:
if !SUB_TRANSTYPE!==H (
   CALL echo sub_transtype_header is %%!SUB_TRANSTYPE!_HEADER%%
)

请注意,== 运算符中缺少 =

这会在子shell 中执行echo


要解释if 语句中的值,请使用

call set "someothervariable=%%!SUB_TRANSTYPE!_HEADER%%"
if "!someothervariable!"=="value" (

【讨论】:

  • 谢谢你,成功了。那么如何在 IF 语句中组合类似的语句呢?大概 CALL 不适用于 IF? IE。 if %%!SUB_TRANSTYPE!_HEADER%%==FALSE ()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多