Windows cmd:从具有动态名称的文件夹运行exe

Windows cmd:从具有动态名称的文件夹运行exe,windows,cmd,Windows,Cmd,我有一个exe文件,比如说,C:\Programs\tools\4.0.97869\program.exe 显然,版本号可能会有所不同,但我完全确定它将始终是4.0 我可以从批处理文件中执行一些命令,指定该exe的路径,如下所示: "C:\Programs\tools\4.0.97869\program.exe" /option:Key somevalue C:\Programs\tools\4.0.*\program.exe 这很好用。但是,我想在这里放置一个通配符,例如: "C:\Pro

我有一个exe文件,比如说,C:\Programs\tools\4.0.97869\program.exe 显然,版本号可能会有所不同,但我完全确定它将始终是
4.0

我可以从批处理文件中执行一些命令,指定该exe的路径,如下所示:

"C:\Programs\tools\4.0.97869\program.exe" /option:Key somevalue
C:\Programs\tools\4.0.*\program.exe
这很好用。但是,我想在这里放置一个通配符,例如:

"C:\Programs\tools\4.0.97869\program.exe" /option:Key somevalue
C:\Programs\tools\4.0.*\program.exe
因为我可以使用
cd

  • 我不想在
    Path
  • 我不想cd到那个目录并从那个里调用
    program.exe
  • 有一种方法可以指定第一个匹配的目录,它具有 需要在一行中执行的文件


    谢谢。

    这里有一个使用PowerShell脚本的解决方案:

    $pathPattern = 'C:\Programs\tools\4.0.*\program.exe'
    
    if(!(Test-Path $pathPattern)){
        throw "Could not find a single executable"
    }
    
    $paths = Get-Item -Path $pathPattern
    
    Invoke-Expression $paths[0]
    

    下面是一个使用PowerShell脚本的解决方案:

    $pathPattern = 'C:\Programs\tools\4.0.*\program.exe'
    
    if(!(Test-Path $pathPattern)){
        throw "Could not find a single executable"
    }
    
    $paths = Get-Item -Path $pathPattern
    
    Invoke-Expression $paths[0]
    

    PowerShell解决方案是一个更好的主意。如果只能使用cmd.exe,则以下操作可能有效。这不是一条单行线。将其存储在.bat文件中并调用它。它通过运行它能找到的第一个“program.exe”来工作。它试图通过将目录搜索排序为最新的第一个来获取最新的

    SETLOCAL ENABLEDELAYEDEXPANSION
    SET EXITCODE=0
    
    SET "EXEWILD=C:\Programs\tools\4.0.*"
    FOR /F %%d IN ("%EXEWILD%") DO (SET "EXEBASE=%%~dpd")
    
    IF NOT EXIST "%EXEWILD%" (
        ECHO ERROR: Tool directory "%EXEWILD%" does not exist.
        SET EXITCODE=4
        GOTO TheEnd
    )
    
    FOR /F "usebackq tokens=*" %%d IN (`DIR /B /O-D "%EXEWILD%"`) DO (
        IF EXIST "%EXEBASE%\%%~d\program.exe" (
            "%EXEBASE%%%~d\program.exe" %*
            SET EXITCODE=!ERRORLEVEL!
            GOTO TheEnd
        ) ELSE (
            ECHO WARNING: program.exe not found in "%EXEBASE%\%%~d"
        )
    )
    
    :TheEnd
    EXIT /B %EXITCODE%
    

    PowerShell解决方案是一个更好的主意。如果只能使用cmd.exe,则以下操作可能有效。这不是一条单行线。将其存储在.bat文件中并调用它。它通过运行它能找到的第一个“program.exe”来工作。它试图通过将目录搜索排序为最新的第一个来获取最新的

    SETLOCAL ENABLEDELAYEDEXPANSION
    SET EXITCODE=0
    
    SET "EXEWILD=C:\Programs\tools\4.0.*"
    FOR /F %%d IN ("%EXEWILD%") DO (SET "EXEBASE=%%~dpd")
    
    IF NOT EXIST "%EXEWILD%" (
        ECHO ERROR: Tool directory "%EXEWILD%" does not exist.
        SET EXITCODE=4
        GOTO TheEnd
    )
    
    FOR /F "usebackq tokens=*" %%d IN (`DIR /B /O-D "%EXEWILD%"`) DO (
        IF EXIST "%EXEBASE%\%%~d\program.exe" (
            "%EXEBASE%%%~d\program.exe" %*
            SET EXITCODE=!ERRORLEVEL!
            GOTO TheEnd
        ) ELSE (
            ECHO WARNING: program.exe not found in "%EXEBASE%\%%~d"
        )
    )
    
    :TheEnd
    EXIT /B %EXITCODE%
    


    您是否愿意使用PowerShell?
    cd C:\prgrams\tools\4.0.*&program.exe
    ?@Joey是否有任何可能的模拟cd?如果找到多个“4.0.something”目录,该怎么办?@lit首先选择任何目录,不管怎样。小版本和大版本现在并不重要。但事实上,总是有一个文件夹,只是名称不同而已。打开它使用PowerShell?
    cd C:\prgrams\tools\4.0.*&program.exe
    ?@Joey是否有任何可能的模拟cd?如果找到多个“4.0.something”目录,该怎么办?@lit首先选择任何目录,不管怎样。小版本和大版本现在并不重要。但事实上,总是有一个文件夹,只是名称不同,可以考虑!虽然不是一行。@TEHEMPRAH保存脚本,但调用脚本的时间为1行;)由于某些原因,PS在该系统上不是一个选项。D:无论如何,在对其使用
    Get Item
    之前,最好先测试路径-Path'C:\Programs\tools\4.0.*\program.exe'
    。@lit同意。固定的,可以考虑!虽然不是一行。@TEHEMPRAH保存脚本,但调用脚本的时间为1行;)由于某些原因,PS在该系统上不是一个选项。D:无论如何,在对其使用
    Get Item
    之前,最好先测试路径-Path'C:\Programs\tools\4.0.*\program.exe'。@lit同意。固定的。