Batch file 是否有公开start命令搜索的路径的API?
通过Batch file 是否有公开start命令搜索的路径的API?,batch-file,winapi,cmd,Batch File,Winapi,Cmd,通过start搜索哪些路径?此路径列表是否可通过WMI、注册表、WSH外壳文件夹常量、.NET方法或任何其他Windows API查询 在cmd控制台中,start命令有点神奇。假设您的默认web浏览器是Firefox。您还安装了Chrome和Opera,但它们既没有设置为默认值,也没有与任何文件类型关联,也没有在您的%PATH%中。考虑以下例子: 开始“歌剧”https://stackoverflow.com 。。。为什么会这样 这很重要的原因是,尽管有start命令的优点,当应用程序使用
start
搜索哪些路径?此路径列表是否可通过WMI、注册表、WSH外壳文件夹常量、.NET方法或任何其他Windows API查询
在cmd
控制台中,start
命令有点神奇。假设您的默认web浏览器是Firefox。您还安装了Chrome和Opera,但它们既没有设置为默认值,也没有与任何文件类型关联,也没有在您的%PATH%中。考虑以下例子:
开始“歌剧”https://stackoverflow.com
。。。为什么会这样
这很重要的原因是,尽管有start
命令的优点,当应用程序使用start
启动时,检索应用程序的PID或窗口句柄仍然是危险的。在cmd
环境中,我更喜欢在for/F
循环中使用wmic进程调用create
来捕获PID。那么,有没有一种方法可以教wmic process call create
启动“opera”或“iexplore”或“outlook”或“winword”或其他应用程序,就像start
一样,而无需完全限定驱动器:\\path\\to\\executable
我以为我找到了解决方案,通过递归扫描HKLM\Software\Client
查找shell\open\command
,然后将每个引用位置临时添加到%PATH%:
rem//temp将已安装的客户端添加到%PATH%以使“调用:显示”的行为类似于“启动”
延迟扩展
对于%%a in(HKLM HKCU)为/f“代币=2*”%%I in(
“注册查询%%a\Software\Clients/s/f命令/k/ve^ | find”(默认值)”
)如果“%%~I”==“REG\u EXPAND\u SZ”(
如果/i“%%~xJ”==”.exe”(
如果“!PATH:%%~J\..!”==“!PATH!”PATH!PATH!;%%~J\..”。。
)对于%%#in(%%J)的else,如果/i“%%~x#”==”.exe,则执行(
如果“!PATH:%%~\\…=!”=“!PATH!”PATH!PATH!;%%~\\。。
)
)否则(
如果/i“%%~xJ”==”.exe”(
如果“!PATH:%%~dpJ=!”==“!PATH!”PATH!PATH!;%%~dpJ
)否则(
对于%%#in(%%J)执行if/i“%%~x#”==”.exe”(
如果“!PATH:%%~dp#=!”=“!PATH!”PATH!PATH!;%%~dp#
)
)
)
endlocal路径%path%和路径%path%
这项工作相当不错,但仍低于start
可以访问的功能。例如:
start”写字板
工作,而
wmic进程调用创建“wordpad.exe”
失败。我记得在DosTips.com上或在这里讨论过这个话题,但我找不到它。希望有人这样做,我们可以将这个问题标记为重复问题 我们知道批处理文件将搜索当前目录,然后搜索路径变量以查找可执行文件。
START
命令还搜索以下注册表路径
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
因此,您有几个选项来查找可执行文件
您可以使用WHERE
命令搜索当前目录和PATH变量中的目录
where notepad.exe
也可以使用FOR
命令搜索路径变量
for %%I in (notepad.exe) do echo %%~$PATH:I
当然,您可以通过执行REG查询来搜索我上面提到的注册表路径。Edit2
这可能与你正在做的事情有关(与为什么某些事情会以这种方式工作相反)
根据先前的回答
请参见Doskey/?
您可以这样做doskey cddesk=cd”%userprofile%\desktop“
然后键入cddesk
通过将所有宏放在批处理文件中,可以自动加载。当然
您也可以使用批处理文件来实现这一点
从技术参考到Windows 2000注册表,Microsoft,
2000年
自动运行HKCU\Software\Microsoft\Command Processor
数据类型范围默认值
REG_SZ命令列表此项没有默认值
描述
包含每次启动Cmd.exe时执行的命令
还可以查看该列表中的批处理文件
特殊名称
在命令提示符下启动shell:desktop
或者在Start-Run(Winkey+R)中,只需shell:desktop
编辑
我只想在这里补充一些注意事项
这是关于使用Start
命令打开可执行文件的。大量规则适用于不可执行文件
不使用Start
CMD会预处理命令行并将FQFN发送到CreateProcess
-因此是CMD搜索路径而不是CreateProcess
是ShellExecute的文档。一切都以调用CreateProcess结束。Plus CMD预处理在这里详细介绍。另外,
start/?
提供了所有三种启动文件方法的文档。这里有一个摘要
一些有趣的事实。CMD如果无法识别文件扩展名,将尝试执行它<代码>ShellExecute将内容嗅探未知文件
引自rojo:感谢链接转储。我正在努力理解ShellExecute
如何使我不必完全限定路径名。这是我的主要问题。“要使用ShellExecute或ShellExecuteEx,您的应用程序必须指定要对其执行操作的文件或文件夹对象,以及指定操作的动词。”我要问的是“指定文件或文件夹对象”部分
它使用CreateProcess下的6个步骤,如果没有找到任何结果,则使用应用程序路径。如果未指定动词,则使用默认动词(通常为Open)。请看我的答案
因此,它是4种技术的交叉点。与MSDos的兼容性、IBM针对OS/2所做的更改以及Microsoft针对Windows 2000所做的更新、启动程序CreateProcess的标准Windows方式,以及Windows 95中基于OLE的shell函数
引用罗乔的话:快!你说得对!在PowerShel中