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

Ray*_*eng 27 string for-loop batch-file token

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

for /d %%g in (%windir%\Assembly\gac_msil\*policy*A.D*) do (
echo %%g
)
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

我想获取以"policy"开头的文件夹名称,但echo %%g:~29不起作用.我也试过set x=%%g,然后echo %x:~29%仍然无法正常工作.

那么,我如何从for循环中的令牌获取子串?

Aac*_*ini 40

当然这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!
)
Run Code Online (Sandbox Code Playgroud)


Aac*_*ini 5

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

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