Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法区分哪个批处理文件运行了可执行文件?_C#_Windows_Batch File_Cmd - Fatal编程技术网

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

C# 有没有办法区分哪个批处理文件运行了可执行文件?,c#,windows,batch-file,cmd,C#,Windows,Batch File,Cmd,例如,假设我有一个文件夹,其中包含以下内容: log.bat clear.bat new.bat init.exe 每个.bat文件调用init一次或多次。我没有访问任何.bat文件的权限,因此无法将变量传递给init.exe。关于init需要知道的一件事是C#应用程序,它可以接受参数 可能性: doskey-结果表明它们不适用于.bat文件 环境变量-我想我可以命名一个名为init的环境变量,它可以执行类似init%~n0的操作来获取批处理文件名。不幸的是,这也不起作用 Hacky Al

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

  • log.bat
  • clear.bat
  • new.bat
  • init.exe
每个
.bat
文件调用
init
一次或多次。我没有访问任何
.bat
文件的权限,因此无法将变量传递给
init.exe
。关于
init
需要知道的一件事是C#应用程序,它可以接受参数

可能性:

  • doskey-结果表明它们不适用于
    .bat
    文件
  • 环境变量-我想我可以命名一个名为
    init
    的环境变量,它可以执行类似
    init%~n0
    的操作来获取批处理文件名。不幸的是,这也不起作用
  • Hacky Alias-创建一个名为
    init.bat
    的批处理文件(正如
    .bat
    文件调用
    init
    不是
    init.exe
    )。然后,在
    init.bat
    文件中,我会简单地将
    init.exe%~n0
    放进去。有两件事出了问题。首先,由于某种原因,
    .bat
    文件的
    init.exe
    优先级高于
    init.bat
    ,因此批处理文件别名甚至没有被调用。其次,
    %~n0
    部分扩展为
    init
    ,它是从
    init.bat
    调用的,而不是其他批处理文件

我运气不好吗?或者有没有一种黑客方法可以解决这个问题?

这不是最优雅的解决方案,但是如果在给定时间只有一个批处理文件在运行,您可以尝试使用
Process.getProcessByName(“cmd”)列出所有
cmd.exe
进程,
然后使用以下方法提取批处理文件的命令行参数,找到运行批处理文件的批处理文件:

或者查看该批处理过程的所有信息

wmic process where "processid=5908" get /format:list

雷米和面条的想法帮助我找到了这个答案。在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);

这怎么会是一个C#问题?@rory.ap很抱歉。
init.exe
文件是一个c#应用程序,所以我认为它可能值得标记。你想在哪里确定?从其他地方运行的代码?或者从Windows?@rory.ap的任意位置手动执行。我想目前我没有太多选择。init.exe是控制台应用程序还是windows应用程序?
//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);