Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在for循环中获取令牌的子字符串?_String_Batch File_For Loop_Token - Fatal编程技术网

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

String 在for循环中获取令牌的子字符串?,string,batch-file,for-loop,token,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\Assem

我使用这个
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
不起作用。 我还试图
设置x=%%g
,然后
回显%x:~29%
,但仍然不起作用


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

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

简单的

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
)

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

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

我最近有一个类似的问题,我想在这里汇编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 /d %%g in (%windir%\Assembly\gac_msil\*) do @echo %%~nxg
    

  • 整洁的我将使用您的建议,但将标记为Aacini的作为答案,因为该解决方案使我了解了更多。您能详细介绍一下这实际上是如何工作的吗?我想做同样的事情,但我想要所有的文件名(不仅仅是“策略”文件名)。我尝试了
    *
    \*.
    ,但它在空格处出现了中断,并给出了意外的结果。@LaggingReflection:所以你想要
    目录/B%windir%\Assembly\gac_msil\
    -应该列出该目录中的所有文件吗?谢谢。我相信有一天它会派上用场的。你能详细介绍一下它是如何工作的吗?我想做同样的事情,但我想要所有的文件名(不仅仅是“策略”文件名)。我尝试了
    *
    \*.*
    ,但它在空格上出现了中断,并给出了意外的结果。@RayCheng哇,就如何在for循环中对变量进行子字符串迭代,搜索/试验了大约一个小时。然后你出现并继续“哦,顺便说一句,这是你如何用两个神奇的字母做到这一点”。这正是我想要的,谢谢你救了我一天:)这里有有用的提示,谢谢。帮助我编写了一个我认为不可能的脚本。@Aacini是否可以直接从参数
    %%g
    中提取子字符串,而不使用辅助变量
    x
    ,也不启用延迟扩展?@alfredcapobianchi:简短回答:否。详细回答:如果仔细阅读问题,你应该注意这句话:“
    echo%%g:~29
    不起作用”。你还救了我一天!setlocal EnableDelayedExpansion沿“!”的用法在for循环中起作用
    for /d %%g in (%windir%\Assembly\gac_msil\*) do @echo %%~nxg