【问题标题】:Getting substring of a token in for loop?在for循环中获取令牌的子字符串?
【发布时间】:2012-01-28 17:01:56
【问题描述】:

我有这个for 循环来获取目录名称列表:

for /d %%g in (%windir%\Assembly\gac_msil\*policy*A.D*) do (
echo %%g
)

输出:

C:\WINDOWS\Assembly\gac_msil\policy.5.0.A.D
C:\WINDOWS\Assembly\gac_msil\policy.5.0.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.20.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.25.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.35.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.55.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.60.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.70.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.6.0.A.D.O

我想获取以“policy”开头的文件夹名称,但 echo %%g:~29 不起作用。 我也试过set x=%%g,然后echo %x:~29%,还是不行。

那么,如何在for 循环中从令牌中获取子字符串?

【问题讨论】:

    标签: string batch-file for-loop token


    【解决方案1】:

    当然,set x=%%g 和 x 的子字符串提取应该可以工作,但请注意,如果子字符串在FOR 循环中,则必须使用 !而不是 %(延迟扩展):

    setlocal EnableDelayedExpansion
    for /d %%g in (%windir%\Assembly\gac_msil\*policy*A.D*) do (
    set x=%%g
    echo !x:~29!
    )
    

    【讨论】:

    • 这里有有用的提示,谢谢。帮我写了一个我认为不可能的脚本。
    • @Aacini 是否可以直接从参数%%g 中提取子字符串,而不使用辅助变量x 并且不启用DelayedExpansion?
    • @AlfredoCapobianchi:简短回答:否。详细回答:如果您仔细阅读问题,您应该注意这句话:"echo %%g:~29 doesn't work"
    • 你也拯救了我的一天! setlocal EnableDelayedExpansion 沿“!”的用法是在 for 循环中起作用的
    【解决方案2】:

    另一方面,如果您想知道“如何在 for 循环中获取标记的最后一部分(名称和扩展名)”,答案是:使用可替换的 %%g 中的 ~Name 和 ~eXtension 修饰符参数:

    for /d %%g in (%windir%\Assembly\gac_msil\*policy*A.D*) do (
    echo %%~NXg
    )
    

    【讨论】:

    • 谢谢。我相信总有一天会派上用场的。
    • 您能否详细说明这实际上是如何工作的?我想做同样的事情,但我想要所有文件名(不仅仅是“策略”文件名)。我尝试了*\*.*,但它在空格处中断并给出了意想不到的结果。
    • @RayCheng 哇,搜索/实验了一个小时左右关于如何在 for 循环中对迭代变量进行子串化。然后你出现并全力以赴“哦,顺便说一句,这是你如何使用 2 个魔术字母来做到的”。这正是我一直在寻找的,感谢您拯救了我的一天:)
    【解决方案3】:

    一个简单的

    dir /B %windir%\Assembly\gac_msil\*policy*A.D*
    

    应该可以解决问题。如果你想循环它:

    for /f %%g in ('dir /B %windir%\Assembly\gac_msil\*policy*A.D*') do (
        echo %%g
    )
    

    【讨论】:

    • 整洁!我会使用您的建议,但将 Aacini 标记为答案,因为该解决方案让我了解了更多信息。
    • 您能否详细说明这实际上是如何工作的?我想做同样的事情,但我想要所有文件名(不仅仅是“策略”文件名)。我尝试了*\*.*,但它在空格处中断并给出了意想不到的结果。
    • @laggingreflex:所以你想要dir /B %windir%\Assembly\gac_msil\ - 应该列出该目录中的所有文件?
    【解决方案4】:

    我最近有一个类似的问题,我想在这里编译 3 个可行的解决方案:

    1. 在你的批处理文件中使用EnableDelayedExpansion,就像在接受的答案中一样

      @echo off
      setlocal EnableDelayedExpansion
      for /d %%g in (%windir%\Assembly\gac_msil\*) do (
       set x=%%g
       echo !x:~29!
      )
      
    2. 使用for /f 处理dir 命令的输出

      for /f "tokens=*" %%g in ('dir /ad /b %windir%\Assembly\gac_msil\*') do @echo %%g
      
    3. 最后,最佳解决方案在这种情况下,使用增强的变量替换。有关此语法的更多信息,请参阅帮助末尾的 for /?

      for /d %%g in (%windir%\Assembly\gac_msil\*) do @echo %%~nxg
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 2020-01-22
      相关资源
      最近更新 更多