是否有办法区分哪个批处理文件运行了可执行文件

本文关键字:批处理文件 运行 可执行文件 法区 是否 | 更新日期: 2023-09-27 18:18:29

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

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

每个.bat文件调用init一次或多次。我做可以访问任何.bat文件,所以没有办法,我可以传递一个变量到init.exeinit是一个c#应用程序,可以接受参数。

可能性:

  • DOSKEYS -原来他们不工作的.bat文件。
  • 环境变量 -我想我可以命名一个名为init的环境变量,它会做一些类似init %~n0的事情来获得批处理文件名。遗憾的是,这也行不通。
  • Hacky Alias -制作一个名为init.bat的批处理文件(作为.bat文件调用init而不是 init.exe)。然后,在init.bat文件中,我将简单地放入init.exe %~n0。有两件事出了问题。首先,由于某种原因,.bat文件比init.bat具有init.exe优先级,因此甚至没有调用批处理文件别名。其次,%~n0部分扩展到init,因为它是从init.bat调用的,而不是其他批处理文件。

我运气不好吗?或者有一种简单的方法可以解决这个问题?

是否有办法区分哪个批处理文件运行了可执行文件

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

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

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);