Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 是否有公开start命令搜索的路径的API?_Batch File_Winapi_Cmd - Fatal编程技术网

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中