chishingchan 发表于 2021-2-20 10:37:42

【已解决】如何获取进程程序的命令行参数?

本帖最后由 chishingchan 于 2021-2-21 09:12 编辑

有些进程程序在后台一闪而过,使用 procexp.exe 也未能及时提取到命令行参数信息!
所以,参考了帮助文件编写了一段代码,但是好像达不到想要的效果!(代码在最后)
求助!求助!求助!

1、在桌面上建立记事本的快捷方式(带参数:abc.txt)


2、双击桌面上的记事本快捷方式,运行 procexp.exe 打开属性


#RequireAdmin
#include <WinAPIProc.au3>
#include <WinAPIHObj.au3>

Local $sProcess = "notepad.exe"

Do
      ;存在进程则退出循环
Until ProcessExists($sProcess)

Local $aAdjust, $aList = 0, $sPCL

Local $hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)

If Not (@error Or @extended) Then
    $aList = ProcessList()
    For $i = 1 To $aList
                If $aList[$i] = $sProcess Then
                        $sPCL = _WinAPI_GetProcessCommandLine($aList[$i])
                        MsgBox(0, $aList[$i], $sPCL)
                        ClipPut($sPCL)
                EndIf
    Next
EndIf

_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
_WinAPI_CloseHandle($hToken)


已找到解决办法:编译成64位的 exe 文件再运行即可!

haijie1223 发表于 2021-2-21 09:38:29

windows自带任务管理器即可查看,点击“查看”-“选择列”-选中“映像路径名称”,“命令行”即可。。

chishingchan 发表于 2021-2-20 10:52:05

帮助里的例子也没有列出 记事本 的 abc.txt 参数!


afan 发表于 2021-2-20 14:27:30

上面的代码执行后随便打开一个txt文件,会立即弹出文件路径提示。

chishingchan 发表于 2021-2-20 17:13:11

afan 发表于 2021-2-20 14:27
上面的代码执行后随便打开一个txt文件,会立即弹出文件路径提示。

这个不要紧,当新建这个 abc.txt 文件后再试就不会再询问路径了。
a 大,帮帮忙,谢谢!
祝:新年快乐、身体健康、心想事成!

afan 发表于 2021-2-20 19:08:50

chishingchan 发表于 2021-2-20 17:13
这个不要紧,当新建这个 abc.txt 文件后再试就不会再询问路径了。
a 大,帮帮忙,谢谢!
祝:新年快乐 ...

新年好~~
我的意思是我这测试正常,弹出了路径参数

chishingchan 发表于 2021-2-20 22:48:13

本帖最后由 chishingchan 于 2021-2-20 22:54 编辑

afan 发表于 2021-2-20 19:08
新年好~~
我的意思是我这测试正常,弹出了路径参数
我的系统:Win7x64
软件版本:3.3.14.5
请问你的运行环境如何?

afan 发表于 2021-2-20 23:10:29

chishingchan 发表于 2021-2-20 22:48
我的系统:Win7x64
软件版本:3.3.14.5
请问你的运行环境如何?

Win7 x86
3.3.14.2

chishingchan 发表于 2021-2-21 09:00:25

这次糟了!这可是 AutoIt3 的问题了!32位 XP 也可以获取到,64位的 Win7/8/10 咋办?!

chishingchan 发表于 2021-2-21 09:11:41

已找到解决办法:编译成64位的 exe 文件再运行即可!

chishingchan 发表于 2021-2-21 10:26:50

haijie1223 发表于 2021-2-21 09:38
windows自带任务管理器即可查看,点击“查看”-“选择列”-选中“映像路径名称”,“命令行”即可。。

当进程一闪而过就查看不了,编程的话可以捕捉短暂进程

haijie1223 发表于 2021-2-21 11:08:05

chishingchan 发表于 2021-2-21 10:26
当进程一闪而过就查看不了,编程的话可以捕捉短暂进程

用ProcessMonitor。也可以自己写个进程拦截,当然这个可能稍微有点难度。

chishingchan 发表于 2021-2-21 11:14:33

本帖最后由 chishingchan 于 2021-2-21 11:15 编辑

haijie1223 发表于 2021-2-21 11:08
用ProcessMonitor。也可以自己写个进程拦截,当然这个可能稍微有点难度。
改进了一下,还是个“半成品”!主程序退了,脚本还驻留,还需要检查!
我的理念:代码难看不要紧,能完成事情就好。#RequireAdmin
#include <WinAPIProc.au3>
#include <WinAPIHObj.au3>

Local $sMain = "SpleeterGui.exe"
Local $sProcess = "ffmpeg.exe"
Global $sReturn

Do
      ;存在主程序则退出此循环
      ;功能即是:等待主程序运行
Until ProcessExists($sMain)

While ProcessExists($sMain)
      ;主程序运行后则循环以下动作
      Do
                ;存在进程则退出循环
      Until ProcessExists($sProcess)
      _DU()
WEnd

Func _DU()
      Local $aAdjust, $aList = 0, $sPCL

      Local $hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
      _WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)

      If Not (@error Or @extended) Then
                $aList = ProcessList()
                For $i = 1 To $aList
                        If $aList[$i] = $sProcess Then
                              $sPCL = _WinAPI_GetProcessCommandLine($aList[$i])
                              $sReturn &= $sPCL & @CRLF
                              ClipPut($sReturn)
                        EndIf
                Next
      EndIf

      _WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
      _WinAPI_CloseHandle($hToken)
;      Return $sReturn
EndFunc

chishingchan 发表于 2021-2-21 11:18:44

成果:
----四声道混合------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-i J:\KwDownload\song\FileName.mp3 -f f32le -ar 44100 -ss 0:00:00.000000 -t 0:10:00.000000 pipe:

-f f32le -ac 2 -ar 44100 -i pipe: -b:a 128k -ar 44100 -strict -2 D:\Users\Administrator\Desktop\FileName/bass.wav -y
-f f32le -ac 2 -ar 44100 -i pipe: -b:a 128k -ar 44100 -strict -2 D:\Users\Administrator\Desktop\FileName/drums.wav -y
-f f32le -ac 2 -ar 44100 -i pipe: -b:a 128k -ar 44100 -strict -2 D:\Users\Administrator\Desktop\FileName/other.wav -y
-f f32le -ac 2 -ar 44100 -i pipe: -b:a 128k -ar 44100 -strict -2 D:\Users\Administrator\Desktop\FileName/piano.wav -y
-f f32le -ac 2 -ar 44100 -i pipe: -b:a 128k -ar 44100 -strict -2 D:\Users\Administrator\Desktop\FileName/vocals.wav -y

-i "D:\Users\Administrator\Desktop\FileName\bass.wav"
-i "D:\Users\Administrator\Desktop\FileName\drums.wav"
-i "D:\Users\Administrator\Desktop\FileName\piano.wav"
-i "D:\Users\Administrator\Desktop\FileName\other.wav"
-filter_complex "volume=4;volume=4;volume=4;volume=4;amix=inputs=4:duration =longest" "D:\Users\Administrator\Desktop\FileName_recombined.wav"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----五声道混合------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-i J:\KwDownload\song\FileName.mp3 -f f32le -ar 44100 -ss 0:00:00.000000 -t 0:10:00.000000 pipe:

-f f32le -ac 2 -ar 44100 -i pipe: -b:a 128k -ar 44100 -strict -2 D:\Users\Administrator\Desktop\FileName/bass.wav -y
-f f32le -ac 2 -ar 44100 -i pipe: -b:a 128k -ar 44100 -strict -2 D:\Users\Administrator\Desktop\FileName/drums.wav -y
-f f32le -ac 2 -ar 44100 -i pipe: -b:a 128k -ar 44100 -strict -2 D:\Users\Administrator\Desktop\FileName/other.wav -y
-f f32le -ac 2 -ar 44100 -i pipe: -b:a 128k -ar 44100 -strict -2 D:\Users\Administrator\Desktop\FileName/piano.wav -y
-f f32le -ac 2 -ar 44100 -i pipe: -b:a 128k -ar 44100 -strict -2 D:\Users\Administrator\Desktop\FileName/vocals.wav -y

-i "D:\Users\Administrator\Desktop\FileName\vocals.wav"
-i "D:\Users\Administrator\Desktop\FileName\bass.wav"
-i "D:\Users\Administrator\Desktop\FileName\drums.wav"
-i "D:\Users\Administrator\Desktop\FileName\piano.wav"
-i "D:\Users\Administrator\Desktop\FileName\other.wav"
-filter_complex "volume=5;volume=5;volume=5;volume=5;volume=5;amix=inputs=5:duration =longest" "D:\Users\Administrator\Desktop\FileName_recombined.wav"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

haijie1223 发表于 2021-2-21 17:27:17

chishingchan 发表于 2021-2-21 11:14
改进了一下,还是个“半成品”!主程序退了,脚本还驻留,还需要检查!
我的理念:代码难看不要紧,能完 ...

能完成你的要求就好。但其实,你这种写法并不是真正意义上的监控。
页: [1]
查看完整版本: 【已解决】如何获取进程程序的命令行参数?