【问题标题】:batch script variable unset in for loop has no effectfor循环中未设置的批处理脚本变量无效
【发布时间】:2012-07-11 12:41:54
【问题描述】:

以下是我的脚本。我正在尝试查看下一层的文件夹并仅选择那些文件夹,因此 ~-9 从路径中提取最后 9 个字符。但是 set var= 不会取消设置变量,因为输出返回时会返回相同的文件夹名称,重复 # 次。批处理也不允许我直接在 %%i 上执行此提取技巧,因此需要局部变量。

如何清除此变量,以便在下一次迭代中采用新值?

@echo off
 for /d %%i in (%1\*) do (
  set var=%%i
  echo %var:~-9%
   set "var="
)

【问题讨论】:

    标签: for-loop batch-file local-variables unset


    【解决方案1】:

    http://judago.webs.com/variablecatches.htm 解释了我的问题。神奇的线条是 setlocal enabledelayedexpansion 并将 var 称为 echo !var:~-9!。 !与 % ...哇! cmd 仍然让我感到惊讶。

    【讨论】:

    • +1,很好地找到了问题的根源。如果名称包含!,您仍然有potential problem。
    【解决方案2】:

    您找到了问题的根源,以及解决方案 - 延迟扩展。

    但如果任何文件名包含! 字符,则在启用延迟扩展时使用 FOR 可能会导致问题。如果值包含 ! 并且启用了延迟扩展,则 for 变量 %%i 的扩展将被破坏。这不是一个常见的问题,但它会发生。

    解决方案是在循环中打开和关闭延迟扩展

    @echo off
    setlocal disableDelayedExpansion
    for /d %%i in (%1\*) do (
      set var=%%i
      setlocal enableDelayedExpansion
      echo !var:~-9!
      endlocal
    )
    

    我也想知道您所说的 “我正在尝试查看下一级文件夹并仅选择那些文件夹,因此 ~-9 从路径中提取最后 9 个字符”时间>。我怀疑您正在尝试获取子文件夹的名称,而没有前导路径信息。如果是这样,那么使用子字符串操作不是一个好的解决方案,因为文件夹名称的长度会有所不同。

    有一个非常简单的方法可以获取不带前导路径信息的文件夹名称:

    for /d %%i in (%1\*) do echo %%~nxi
    

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2016-04-14
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      相关资源
      最近更新 更多