代码之家  ›  专栏  ›  技术社区  ›  Johannes

基于模式匹配的批处理文件舒适的程序执行

  •  0
  • Johannes  · 技术社区  · 6 年前

    我经常遇到这样一个用例,在这个用例中,我以自动的方式从另一个源获得一个包(比如nuget install)

    在公共根目录下,我想执行目标程序,但我没有确切的路径。我认为有一种简单的方法可以执行类似的操作,理想情况下是基于regex。

    我现在写的是:

    REM Example Paths:
    REM packages\MyTool.1.0.0\tools\MyTool.exe
    REM packages\MyTool.1.1.0.beta0001\tools\MyTool.exe
    REM packages\MyTool\MyTool.exe
    
    pushd packages
    for /f "delims=" %%A in ('dir MyTool.exe /s /N /B') do set "MyToolEXE=%%A"
    popd
    
    call %MyToolEXE% parameter
    

    我想写的是

    call packages\.*\MyTool.exe parameter
    

    有什么方法可以去掉for语句,使调用以一行方式进行吗?

    编辑:

    如果程序没有参数,一行可能是:

    where MyTool.exe /R packages /F | cmd
    

    然而,这是一个角落的情况,因为通常需要参数。

    编辑:

    正如Stephen在评论中指出的,如果工作目录不是问题,并且路径的详细信息是已知的,那么可以使用模式匹配 pushd 另一句话可能是:

    pushd packages\MyTool*\tools & MyTool.exe parameter & popd
    

    但是,这会更改工作目录,例如,如果参数是相对路径,则可能会出现问题。

    2 回复  |  直到 6 年前
        1
  •  2
  •   penknife    6 年前
    @echo off &:: callme.bat location regex args
    setlocal
    pushd "%~1"
    set "Mt="
    REM find newest %2
    for /f "tokens=*" %%? in ('dir /b /a-d /s /o-d /t:w "%~nx2" ^|findstr /i /r /c:"%~2"') do if not defined Mt set "Mt=%%~?"
    popd
    if defined Mt call %Mt% %~3
    endlocal

    将其放在%PATH%位置之一

        2
  •  1
  •   Johannes    6 年前

    User@Compo为满足所有要求的一行程序提供了此解决方案:

    ForFiles /P packages /M "MyTool.exe" /S /C "cmd /c @path parameter"
    

    这整齐地排成一行,在工作空间上执行并接受参数。

    我在此宣布这是批处理文件的“复合匹配执行习惯用法”。