2017-12-03 201 views
2

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

+0

简单易行。回声%0 – Squashman

+0

@Andrei:'任务列表/网络连接 “imagename EQ CMD.EXE”/ v'可能会有帮助。用'for/f'循环解析它以获得窗口标题。 – Stephan

+0

@Squashman:请再读一遍我的问题。试图让我更清楚我以后的事情。 – Andrei

回答

1

的问题How to check if a process is running via a batch script?answer written by vtrz包含你正在寻找的命令:

%SystemRoot%\System32\wbem\wmic.exe PROCESS where (name="cmd.exe") GET CommandLine 

Windows Management Instrumentation Command-line实用程序与这些参数通过用于启动它们的命令行行列出所有正在运行的进程cmd.exe线。

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

好吧,如果执行的批处理文件中使用命令冠军给自己的控制台窗口意义的标题,也可以使用任务列表获取有关命令进程的信息与特定的窗口标题或使用TASKKILL终止或杀死一个具有特定窗口标题的命令进程。

+0

我不敢相信我没想到打开WMI! Duh ... WIN32_Process - > CommandLine会做的。我将不得不通过ProcessID来查询WIN32_Process,以确保从那里获得正确的实例并对CommandLine进行分词。谢谢 :) – Andrei

1

这是我结束了(VB.NET)的功能,如果有人在意。它可以从cmd.exe进程检索蝙蝠路径,也可以使用它从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 
相关问题