2016-11-16 46 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 
相关问题