首页 > 解决方案 > Windows批处理如何查找文件并使用文件夹深度支持运行它

问题描述

我试图在子目录中找到安装文件并将其作为参数化静默安装运行。子目录名称不断变化,我也需要深入执行= 1,因为有多个安装文件。例如:

root dir C:\temp
C:\temp\
|-\subdir1\setup.exe (want to run this one but it sometimes can be Setup.exe)
|-\subdir1\subsubdir1\setup.exe
|-\subdir1\subsubdir2\
|-\subdir1\subsubdir3\setup.exe

尝试在 powershell 中编写脚本,其中文件的完整路径保存到变量并注入命令,但 powershell 在运行静默安装时存在问题,并且在大多数情况下它们无法正确安装。不知道为什么。从 cmd 运行相同的命令时,它工作得非常好。遗憾的是错误地删除了它,因此无法显示代码。另一个问题是 powershell 版本因不同的 Windows 类型而异,因此一些内部命令可以工作,而有些则不能。

还尝试从类似的答案中以某种方式修改此解决方案:

for /f "delims=" %%i in ('dir /b /a-d /s C:\temp\setup.exe /someparams') do "%%~fi"

这里的问题是dir不支持深度,这导致一个接一个地运行所有子目录中的所有设置文件。不知道如何让它只为一个人工作。

现在,我正在尝试使用批处理执行与 powershell 中相同的操作,并具有以下功能:

for /r C:\temp %%a in (*) do if "%%~nxa"=="setup.exe" set p=%%~dpnxa
if defined p (
start "%p% /silent /othervar"
) else (
echo Something did not work.
)

现在我被卡住了,不知道如何实现我想要的。希望有人可以提供帮助。

标签: windowsbatch-filefind

解决方案


您的第一个命令错误地插入/someparams到目录,而不是检查 setup.exe 的存在并将它们传递给它。

第二批使用/r和不必要的递归并在 subsubdirs 中找到所有 setup.exe。

用于For /D限制到 1 级目录

for /d %%a in ("C:\temp\*") do if exist "%%~fa\setup.exe" "%%~fa\setup.exe" /someparams

或者 - 如果 setup.exe 期望在当前目录中找到文件/文件夹 - 使用:

for /d %%a in ("C:\temp\*") do if exist "%%~fa\setup.exe" (
    cd /D "%%~fa"
    setup.exe /someparams
)

推荐阅读