Windows 从外部应用程序获取正在运行的bat文件的名称

Windows 从外部应用程序获取正在运行的bat文件的名称,windows,batch-file,Windows,Batch File,我试图找出外部应用程序中运行的bat文件的完整路径。 进程是cmd.exe,但我无法获取实际运行的bat的名称。 在任务管理器中,它显示为cmd.exe 如果将进程作为对象获取,则与bat最接近的属性位于MainWindowTitle中。 有没有办法从运行cmd进程中获取完整的运行bat路径?问题中包含您要查找的命令: %SystemRoot%\System32\wbem\wmic.exe PROCESS where (name="cmd.exe") GET CommandLine 带有这些参

我试图找出外部应用程序中运行的bat文件的完整路径。 进程是cmd.exe,但我无法获取实际运行的bat的名称。 在任务管理器中,它显示为cmd.exe 如果将进程作为对象获取,则与bat最接近的属性位于MainWindowTitle中。 有没有办法从运行cmd进程中获取完整的运行bat路径?

问题中包含您要查找的命令:

%SystemRoot%\System32\wbem\wmic.exe PROCESS where (name="cmd.exe") GET CommandLine
带有这些参数的实用程序使用用于启动它们的命令行逐行列出所有正在运行的
cmd.exe
进程

但这意味着,如果用户打开一个命令提示符窗口,并从此窗口中启动一个批处理文件,该批处理文件由已启动的
cmd.exe
执行,则此命令进程的命令行输出仅为
“C:\Windows\System32\cmd.exe”
。据我所知,无法从已经运行的命令进程中获取该命令进程当前执行的信息


如果执行的批处理文件使用命令title为其控制台窗口提供有意义的标题,也可以使用tasklist获取有关具有特定窗口标题的命令进程的信息,或者使用taskkill终止或终止具有特定窗口标题的命令进程。

如果有人关心,这就是我最后使用的函数(VB.NET)。它可以从cmd.exe进程中检索bat路径,我也可以使用它从wscript.exe获取vbs文件。它接收cmd.exe或wscript.exe的ProcessID作为参数,并返回字符串列表,因为我还需要获取传递给vbs的参数文件。在我使用它的场景中,解析部分在列表中工作得很好

Function GetArgFiles(PID As Integer) As List(Of String)
    Dim Ret As New List(Of String)
    Try
        Dim MOS As New ManagementObjectSearcher("root\CIMV2", "SELECT Name, CommandLine FROM WIN32_Process where ProcessID = '" & PID & "'")
        For Each MO As ManagementObject In MOS.[Get]()
            Try
                Dim name As String = MO.GetPropertyValue("Name")
                Dim CommandLine As String = MO.GetPropertyValue("CommandLine")
                If CommandLine Is Nothing Then Exit Try
                For Each CLE As String In New List(Of String)(CommandLine.Split(Chr(34)))
                    Try
                        CLE = CLE.Trim
                        If CLE.Length < 5 Then Continue For
                        If CLE.ToLower Like "*" & name.Trim.ToLower & "*" Then Continue For
                        If CLE Like "*:\*" Then
                            CLE = CLE.Substring(CLE.LastIndexOf(":\") - 1)
                        Else
                            Continue For
                        End If
                        If CLE.Contains("/") Then CLE = CLE.Substring(0, CLE.LastIndexOf("/"))
                        If CLE.Substring(5).Contains(":") Then CLE = CLE.Substring(0, CLE.LastIndexOf(":"))
                        If File.Exists(CLE.Trim) Then Ret.Add(CLE.Trim)
                    Catch
                    End Try
                Next
            Catch
            End Try
        Next
    Catch
    End Try
    Return Ret
End Function
函数GetArgFiles(PID为整数)作为列表(字符串) Dim Ret作为新列表(字符串) 尝试 Dim MOS作为新的ManagementObjectSearcher(“根目录\CIMV2”,“从WIN32_进程中选择名称,命令行,其中ProcessID=”&PID&“”) 将每个生产任务作为生产任务中的管理对象。[Get]() 尝试 Dim名称为String=MO.GetPropertyValue(“名称”) 将命令行设置为字符串=MO.GetPropertyValue(“命令行”) 如果命令行为空,则退出并重试 对于新列表中的每个CLE作为字符串(字符串的列表)(CommandLine.Split(Chr(34))) 尝试 CLE=CLE.修剪 如果长度小于5,则继续 如果CLE.ToLower类似于“*”&name.Trim.ToLower&“*”,则继续 如果CLE像“*:\*”那么 CLE=CLE.Substring(CLE.LastIndexOf(“:\”)-1) 其他的 继续 如果结束 如果CLE.Contains(“/”),则CLE=CLE.Substring(0,CLE.LastIndexOf(“/”) 如果CLE.Substring(5).包含(“:”),则CLE=CLE.Substring(0,CLE.LastIndexOf(“:”) 如果File.Exists(CLE.Trim),则Ret.Add(CLE.Trim) 抓住 结束尝试 下一个 抓住 结束尝试 下一个 抓住 结束尝试 回程网 端函数
非常简单。回声%0@Andrei:
tasklist/fi“imagename eq cmd.exe”/v
可能会有所帮助。使用
for/f
循环对其进行分析,以获得窗口标题。@Squashman:请再次阅读我的问题。试图更清楚地说明我在追求什么。我不敢相信我没有想到要打开WMI!嗯。。。WIN32_进程->命令行就可以了。我必须按ProcessID查询WIN32_进程,以确保从中获得正确的实例和pharse命令行。谢谢:)