是否有办法区分哪个批处理文件运行了可执行文件
本文关键字:批处理文件 运行 可执行文件 法区 是否 | 更新日期: 2023-09-27 18:18:29
例如,假设我有一个文件夹,其中包含以下内容:
-
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
, 而不是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);