2016-11-16 45 views
1

舉例來說,假設我有一個在它下面的一個文件夾:有沒有辦法區分哪個批處理文件運行可執行文件?

  • log.bat
  • clear.bat
  • new.bat
  • init.exe

每個.bat文件調用init一次或多次倍。我做不是有權訪問任何.bat文件,所以我沒有辦法將一個變量傳遞給init.exe。關於init的一件事是一個C#應用程序,可以接受參數。

可能性:

  • DOSKEYS - 原來,他們不爲.bat文件。
  • 環境變量 - 我想我可以命名一個名爲init的環境變量,它將執行類似init %~n0的操作來獲取批處理文件名。可悲的是,這也不起作用。
  • 哈克別名 - 製作一個名爲init.bat一個批處理文件(如.bat文件調用initinit.exe)。然後,在init.bat文件中,我簡單地將init.exe %~n0。這兩件事出錯了。首先,.bat文件出於某種原因需要init.exe優先於init.bat,所以批處理文件別名甚至沒有被調用。其次,%~n0部分展開爲init,因爲它是從init.bat調用的,而不是其他批處理文件。

我運氣不好嗎?還是有一種可以爲此工作的黑客方法?

+0

這是一個C#問題? –

+0

@ rory.ap對不起。 'init.exe'文件是一個C#應用程序,所以我認爲它可能是值得標記的。 – John

+0

你在哪裏試圖做出這個決定?從運行在其他地方的代碼?或從Windows手動? –

回答

0

都雷米和麪條的想法讓我來到這個答案。在C#中,我使用以下命令獲取調用可執行文件的終端的PID:

//Get PID of current terminal 
//Reference: https://github.com/npocmaka/batch.scripts/blob/master/hybrids/.net/getCmdPID.bat 

var myId = Process.GetCurrentProcess().Id; 
var query = String.Format("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {0}", myId); 
var search = new ManagementObjectSearcher("root\\CIMV2", query); 
var results = search.Get().GetEnumerator(); 
if (!results.MoveNext()) 
{ 
    Console.WriteLine("Error"); 
    Environment.Exit(-1); 
} 

var queryObj = results.Current; 
var parentId = queryObj["ParentProcessId"]; 
int myPid = Convert.ToInt32(parentId); 
0

這還不是最完美的解決方案,但如果只是在給定時間運行的批處理文件中的一個,你可以嘗試列出所有cmd.exe過程與Process.GetProcessesByName("cmd"),然後找到一個通過提取運行批處理文件的一個使用這種方法的命令行參數:https://stackoverflow.com/a/2633674/6621790

1
C:\Windows\system32>wmic process where "commandline like 'notepad'" get parentprocessid 
ParentProcessId 
5908 


C:\Windows\system32>wmic process where "processid=5908" get commandline 
CommandLine 
C:\Windows\system32\cmd.exe /c ""C:\Users\User\Desktop\New Text Document (2.bat" " 

或者看到那批過程中的所有信息

wmic process where "processid=5908" get /format:list 
相關問題