【问题标题】:Is there a way to distinguish which batch file ran an executable?有没有办法区分哪个批处理文件运行了可执行文件?
【发布时间】:2016-11-17 23:27:20
【问题描述】:

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

  • 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.exe 优先于init.bat,因此甚至没有调用批处理文件别名。其次,%~n0 部分扩展为 init,因为它是从 init.bat 调用的,而不是其他批处理文件。

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

【问题讨论】:

  • 这是一个 C# 问题吗?
  • @rory.ap 抱歉。 init.exe 文件是一个 c# 应用程序,所以我认为它可能值得标记。
  • 您在哪里尝试做出此决定?从其他地方运行的代码?还是从 Windows 手动?
  • @rory.ap 任何地方。我认为我目前没有太多选择。
  • init.exe 是控制台应用还是 Windows 应用?

标签: c# windows batch-file cmd


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        相关资源
        最近更新 更多