【问题标题】:Windows batch filename globbingWindows 批处理文件名通配符
【发布时间】:2011-05-15 21:45:27
【问题描述】:

简而言之,我想将此 bash 表达式移植到 Windows 批处理文件中:

echo {foo,bar,baz}/*.{agent,event,plan}

目前我使用echo foo/*.agent foo/*.event foo/*.plan bar/*.agent etc...,但随着目录数量的增长和一些新扩展的使用,修改这一行变得非常烦人。

【问题讨论】:

    标签: batch-file wildcard glob


    【解决方案1】:

    每行一个(不确定是否可以):

    @echo off
    for %%A in (foo,bar,baz) do (
     for %%B in (agent,event,plan) do echo %%A/*.%%B
    )
    

    对于所有内容,您可能需要一个 hack:

    @echo off
    SETLOCAL ENABLEEXTENSIONS
    for %%A in (foo,bar,baz) do (
     for %%B in (agent,event,plan) do (SET /P "dummy=%%A/*.%%B ") < NUL
    )
    echo.
    

    视为文件和文件夹列表(只会打印现有文件):

    @echo off
    SETLOCAL ENABLEEXTENSIONS
    for %%A in (foo,bar,baz) do (
        for %%B in (agent,event,plan) do (
            for %%C in (%%A/*.%%B) do (SET /P "dummy=%%A/%%~nxC ") < NUL
        )
    )
    echo.
    

    【讨论】:

    • 抱歉,需要将所有参数放在一行中。
    • @ext 遗憾的是,windows echo 中没有真正的数组/列表支持。你有没有办法接受每行输入?其他任何事情都将成为黑客......
    • @Anders 遗憾的是,不,参数被提供给(专有)解析器,该解析器必须知道所有文件以解决依赖关系。但我想破解是可以的,比每次手动更改线路要好,因为这既费时又容易出错。
    • 嗯,有个小问题就是 * 通配符没有扩展。
    • 在不相关的说明中,有谁知道如何为 * 代码块强制使用特定格式?