在目录中找到特定的* .exe文件,并使用参数运行应用程序

时间:2018-08-24 05:12:40

标签: batch-file cmd scripting

我试图递归地在“ C:\ Builds”文件夹中找到所有“ MyApp.exe”应用,并使用“立即关闭createdatabase”参数/参数运行这些应用。

到目前为止我搜索的内容:ForFiles Microsoft docs

这是forfiles模式:

forfiles [/p <Path>] [/m <SearchMask>] [/s] [/c "<Command>"] [/d [{+|-}] [{|}]]

这是我所拥有的:

forfiles /p c:\Builds /s /m MyApp.exe /c "cmd /c start @path" "createdatabase closeimmediately"

如果我在上述脚本上运行,则显示错误:

ERROR: Invalid argument/option - 'createdatabase closeimmediately'.Type "FORFILES /?" for usage.

如果我不带参数运行,它将正确找到应用并运行,但是我需要带参数运行:

forfiles /p c:\Builds /s /m MyApp.exe /c "cmd /c start @path"

如何在ForFiles中运行带有参数的应用程序?

2 个答案:

答案 0 :(得分:2)

我知道评论中已经提到了这一点,但是评论太长了,我无法发表体面的评论,因此这里是一个答案。这样应该可以完全满足您的要求,它将递归搜索文件并执行if exist

@echo off
for /r "c:\Builds" %%i in (myapp.exe) do if exist "%%i" "%%i" createdatabase closeimmediately

一种略有不同的方式,找到所有可执行文件,然后在名称与myapp.exe相匹配的情况下启动:

for /r "c:\Builds" %%i in (*.exe) do if /I "%%~nxi" == "myapp.exe" "%%I" createdatabase closeimmediately

答案 1 :(得分:1)

有多种方法可以在MyApp.exe和所有子文件夹中搜索C:\Build,并使用两个参数createdatabasecloseimmediately执行找到的可执行文件。


第一个解决方案使用命令 FOR 搜索与MyApp*.exe中的通配符模式C:\Build和任何非隐藏的子文件夹匹配的任何文件。

要在批处理文件中使用:

for /R "C:\Build" %%I in ("MyApp*.exe") do if /I "%%~nxI" == "MyApp.exe" "%%I" createdatabase closeimmediately

在命令提示符窗口中使用:

for /R "C:\Build" %I in ("MyApp*.exe") do @if /I "%~nxI" == "MyApp.exe" "%I" createdatabase closeimmediately

圆括号内的字符串必须至少包含一个*?才能定义通配符模式。否则,仅使用MyApp.exe中的"MyApp.exe"及其所有子文件夹, FOR 将不会搜索名称为C:\Build的文件。它将简单地将字符串"MyApp.exe"(用双引号引起来)附加到在C:\Build文件夹结构中找到的每个文件夹的文件夹路径中,并将文件夹路径+ "MyApp.exe"分配给循环变量{{1} },然后执行引用循环变量的命令行。

IF 条件用于确保仅执行I,而不是 FOR 偶然发现的MyApp.exe通配符模式MyAppOther.exe。由于MyApp*.exe,字符串比较不区分大小写。

也可以使用其他通配符模式,例如/I。这可以减少误报的数量。但是为了安全起见,仍应使用 IF 条件。


第二种解决方案是仅使用MyApp.exe*并在执行之前检查给定文件夹路径中是否确实存在具有该名称的文件。

要在批处理文件中使用:

MyApp.exe

在命令提示符窗口中使用:

for /R "C:\Build" %%I in (MyApp.exe) do if exist "%%I" "%%I" createdatabase closeimmediately

for /R "C:\Build" %I in (MyApp.exe) do @if exist "%I" "%I" createdatabase closeimmediately 在圆括号中指定,而不用MyApp.exe括起来,否则分配给循环变量"的字符串例如是I而不是{{1} }。通过自动纠错,字符串值C:\Build\"MyApp.exe"可能也可以工作,这取决于实际使用的字符串而不是C:\Build\MyApp.exe。但这并不是真正安全的方法,并且如果字符串C:\Build\"MyApp.exe"包含空格,逗号,分号或其他字符,例如MyApp.exe,则此方法不起作用。


第三个解决方案是使用命令 DIR 搜索没有通配符模式的MyApp.exe,仅查找具有相同名称的文件,然后让 FOR 执行找到了具有该名称的可执行文件。

要在批处理文件中使用:

&()[]{}^=;!'+,`~

在命令提示符窗口中使用:

MyApp.exe

FOR 相比,命令 DIR 确实搜索名称为for /F "delims=" %%I in ('dir "C:\Build\MyApp.exe" /A-D-H /B /S 2^>nul') do "%%I" createdatabase closeimmediately 的文件,即使在参数字符串中不包含for /F "delims=" %I in ('dir "C:\Build\MyApp.exe" /A-D-H /B /S 2^>nul') do @"%I" createdatabase closeimmediately 之类的通配符或MyApp.exe

FOR 在以*为背景的单独命令过程中执行 DIR 命令行,并捕获为处理 STDOUT 而编写的所有内容>该命令过程。

也请阅读有关Using Command Redirection Operators的Microsoft文章,以获取?的解释。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符cmd.exe /C必须在 FOR 命令行上使用脱字符号2>nul进行转义,才能被解释为文字字符。 FOR ,它将在后台启动的单独命令进程中执行嵌入式>命令行。

^用于抑制 DIR 输出的错误消息,以将 STDERR 重定向到设备 NUL (如果没有)文件dir可以在2>nul或其子目录中找到。

DIR 的输出是因为MyApp.exeC:\Build仅是找到的每个/B的完整合格文件名,即文件路径+文件名+文件扩展名。一行一行。

FOR 通过跳过空行和以分号开头的行逐行处理捕获的输出。这样的行肯定不会由 DIR 和使用的选项输出。

FOR 还将每行分成空格/制表符的子字符串(令牌),并且仅将第一个子字符串分配给循环变量/S。这里不希望这种字符串拆分行为,因为文件夹名称可能包含一个或多个空格。因此, FOR 选项MyApp.exe用于定义一个空的定界符列表,以禁止行分割行为。


要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • I
  • delims=
  • dir /?