有没有办法区分哪个批处理文件运行可执行文件?

时间:2016-11-16 20:18:44

标签: c# windows batch-file cmd

例如,假设我有一个包含以下内容的文件夹:

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

每个.bat文件调用init一次或多次。我可以访问任何.bat文件,因此我无法将变量传递给init.exe。关于init的一件事是C#应用程序,可以接受参数。

的可能性:

  • DOSKEYS - 原来他们不适用于.bat个文件。
  • 环境变量 - 我想我可以命名一个名为init的环境变量来执行类似init %~n0的操作来获取批处理文件名。可悲的是,这也不起作用。
  • Hacky Alias - 制作名为init.bat的批处理文件(.bat个文件调用init {{1 }})。然后,在init.exe文件中,我只需添加init.bat。这有两个问题。首先,init.exe %~n0文件由于某种原因优先于.bat init.exe,因此甚至没有调用批处理文件别名。其次,init.bat部分扩展为%~n0,因为它是从init调用的,而不是其他批处理文件。

我运气不好吗?或者有一种可以为此工作的hacky方法吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这不是最优雅的解决方案,但如果在给定时间只有其中一个批处理文件正在运行,您可以尝试使用cmd.exe列出所有Process.GetProcessesByName("cmd"),进程通过使用以下方法提取其命令行参数来查找运行批处理文件的那个:https://stackoverflow.com/a/2633674/6621790

答案 2 :(得分:0)

Remi和Noodles的想法帮助我得出了这个答案。在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);