【问题标题】:Assigning Variable in a loop (batch file) [duplicate]在循环中分配变量(批处理文件)[重复]
【发布时间】:2020-10-20 00:04:40
【问题描述】:

我将把我的整体问题归结为一个非常简单的问题。如何在批处理文件的 for 循环中分配变量?

如果我在 windows 中使用以下批处理文件:

for %%f in (.\Update\!dos\*.zip) do (
    echo %%f
    set FileName3=%%f
    echo %FileName3%
    pause
)

echo 将是 %%f 的正确值,但 echoes 对 %FileName3% 没有任何意义

然后我通过直接为FileName3 分配像test 这样的直接值来测试它,但失败了。

在寻找解决方案时,常用的指针是SETLOCAL enabledelayedexpansion

但是,如果我将它添加到批处理文件的顶部,它就会停止运行。因此,虽然我认为这可能是解决方案的一部分,但无法运行批处理文件进行测试,但我无法确定。

需要明确的是,SETLOCAL enabledelayedexpansion 在我的批处理文件的顶部,如果我双击该文件没有任何反应。如果我从命令行运行它,它只是回到提示符,就好像什么都没发生一样。

所以我的问题是,如何在批处理文件的循环中分配变量?如果答案是使用SETLOCAL enabledelayedexpansion,那么为什么要将它添加到我的批处理文件中导致它什么都不做。

【问题讨论】:

标签: batch-file


【解决方案1】:

在您的情况下,在脚本顶部启用延迟扩展将不起作用。原因是您的部分源位置包含! 字符,由于延迟扩展,名称中将省略该字符,并且您的脚本将结束,因为路径.\Update\dos\ 不存在。

诀窍是只在需要的地方启用延迟扩展。

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
If Not Exist "Update\!dos\*.zip" GoTo :EOF
For %%G In ("Update\!dos\*.zip") Do (
    Echo %%G
    Set "FileName3=%%G"
    SetLocal EnableDelayedExpansion
    Echo !FileName3!
    EndLocal
)
Pause

但是,您需要注意的是,在循环SetLocal 期间定义的任何变量都将在下一个EndLocal 中变为未定义。这意味着如果您稍后在代码中需要这些变量,您将需要使用一种方法将这些变量传递给EndLocal 屏障。 但是,这超出了您的特定代码示例的范围,因此未包含在此示例中。

【讨论】:

  • 非常感谢您的解释。
猜你喜欢
  • 2020-08-12
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2021-01-01
  • 2014-09-14
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多