在for循环中获取令牌的子串?

时间:2011-12-27 18:53:43

标签: string batch-file for-loop token

我有这个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循环中获取令牌的子串?

5 个答案:

答案 0 :(得分:38)

当然set x=%%g和x的子字符串提取应该有效,但要注意,如果子字符串是在<循环中的,那么必须完成!而不是%(延迟扩展):

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

一个简单的

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
)

答案 3 :(得分:0)

我最近有一个类似的问题,我想在这里编译 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
    

答案 4 :(得分:-3)

您必须使用setlocal EnableDelayedExpansion!variable!代替%variable%,所以:

setlocal EnableDelayedExpansion

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