我试图递归地在“ 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中运行带有参数的应用程序?
答案 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
,并使用两个参数createdatabase
和closeimmediately
执行找到的可执行文件。
第一个解决方案使用命令 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.exe
和C:\Build
仅是找到的每个/B
的完整合格文件名,即文件路径+文件名+文件扩展名。一行一行。
FOR 通过跳过空行和以分号开头的行逐行处理捕获的输出。这样的行肯定不会由 DIR 和使用的选项输出。
FOR 还将每行分成空格/制表符的子字符串(令牌),并且仅将第一个子字符串分配给循环变量/S
。这里不希望这种字符串拆分行为,因为文件夹名称可能包含一个或多个空格。因此, FOR 选项MyApp.exe
用于定义一个空的定界符列表,以禁止行分割行为。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
I
delims=
dir /?