使用 wmic 获取传递给可执行文件的参数

Getting the arguments passed to a executable using wmic

我正在尝试获取由另一个程序启动的可执行文件的命令行参数。

我尝试了 this 答案中提到的命令,但我无法理解语法:(

我正在尝试获取进程的命令行参数,我有 PID 和进程名称,在这种情况下,我正在尝试获取用于测试命令的 ping 命令的参数...

提前致谢:)

试试这个:

wmic process where "name='ping.exe'" get commandline /format:list

或者如果您更喜欢通过 PID 查询:

wmic process where "processid='NNNN'" get commandline /format:list

wmic使用一种叫做WQL的查询语言,类似于SQL。您可以使用 wmic process where "name like 'ping%'" get commandline 之类的通配符(但一定要在批处理脚本中将 %% 加倍),改变输出样式(列表、csv,甚至 html)和其他魔术。有关详细信息,请从命令行查看 wmic /?


如果要将任何命令的输出捕获到变量,请使用 for /f 循环。 help for 在 cmd 控制台中获取更多信息。在 cmd 控制台中试试这个:

for /f "delims=" %I in ('wmic process where "name='ping.exe'" get commandline /format:list ^| find "="') do set "%I"

您确实会注意到一些非常奇怪的事情。该命令的输出类似于:

" \Users\username>set "CommandLine=ping -n 60 localhost

右引号打印在行的开头!这不是很奇怪吗?那是因为 WMI 查询结果是用 UCS-2 LE 编码的,而不是 ANSI。

我喜欢使用的一种解决方法是使用 /format:csv 并向查询添加一次性列。

从批处理脚本中:

for /f "tokens=2 delims=," %%I in (
    'wmic process where "name='ping.exe'" get commandline^,status /format:csv'
) do set "commandline=%%I"

...这样你就不会捕获任何对变量的无形背叛。