我有这个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
循环中获取令牌的子串?
答案 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 个可行的解决方案:
在批处理文件中使用 EnableDelayedExpansion
,如接受的答案
@echo off
setlocal EnableDelayedExpansion
for /d %%g in (%windir%\Assembly\gac_msil\*) do (
set x=%%g
echo !x:~29!
)
使用 for /f
处理 dir
命令的输出
for /f "tokens=*" %%g in ('dir /ad /b %windir%\Assembly\gac_msil\*') do @echo %%g
最后,在本例中使用增强型变量替换的最佳解决方案。有关此语法的详细信息,请参阅 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!
)