2017-12-03 269 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 
相關問題