Everything 支持 多实例 运行

出现的问题

我们项目组做了一个AI助手,调用了everything.exe 和 es.exe 实现了文件搜索的功能。但是在发布灰度使用的,好多用户反馈只要用了AI助手的文件搜索后,本机安装的everything的程序就调用不出来了。具体的现象如下图,点击桌面的Everything就不会显示弹出搜索界面了

 

image

 

排查问题

查阅了Everything官方网站,是支持多实例运行的:Multiple Instances - voidtools

Everything 默认只能运行一个实例。

当运行 Everything.exe 时,它会检测已存在的实例。如果发现已存在实例,那么命令行选项将会发送并由已存在实例执行。如果未发现已存在实例,则创建一个新实例。

以多实例运行 Everything,使用命名实例

命名实例

Everything 默认使用未命名实例。

指定一个唯一的名称给 Everything 实例以使用多实例。

每个实例只能有一个单独的实例名称。

指定名称给实例:

启动 Everything.exe 时,使用 -instance 命令行选项以指定实例名称。

例如:

Everything.exe -instance "ETP Server"

命名实例使用单独的设置和数据。

例如:命名实例 "ETP Server" 将使用 Everything-ETP SERVER.ini 作为设置文件。

实例名称位于 Everything 搜索窗口标题栏和鼠标悬浮于托盘图标时工具提示。

服务

Everything 默认为每个实例安装一个服务。

 

为所有实例使用相同服务,使用 -service-pipe-name 命令行选项或 service_pipe_name ini 选项以指定相同服务管道名。

默认未命名管道名为:

\\\\.\\PIPE\\Everything Service

例如:用补个不同的实例名连接默认服务管道:

Everything.exe -instance "ETP Server" -service-pipe-name "\\\\.\\PIPE\\Everything Service"

检查代码,虽然我们在程序内部内置了Everything.exe 和 es.exe,用于防止用户没有安装Everything的情况,但是我们程序启动,都是直接启动的Everything.exe,也就是默认的默认的实例。这样的启动方式,会触发只能运行单一的默认一个实例。

而我们点击桌面的Everything.exe,也是运行默认的实例,所以会出现启动不了桌面点击的Everything应用

     /// <summary>
     /// 启动Everything
     /// </summary>
     public async Task StartEverythingAsync()
     {
         string processName = "Everything";
         Process[] processes = Process.GetProcessesByName(processName);
         if (processes.Length >= 2) return;

         var currentDomainBaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
         _logger.Info($"调用{processName} ,路径:{currentDomainBaseDirectory}");
         StartProcess(processName, currentDomainBaseDirectory);
         await Task.Delay(100);
     }

 

解决方案:

1、Ai助手启动Everything,通过指定 instance 名称的方式启动。

  /// <summary>
  /// 启动Everything
  /// </summary>
  public async Task StartEverythingAsync()
  {
      string processName = "Everything";
      Process[] processes = Process.GetProcessesByName(processName);
      if (processes.Length >= 2) return;

      var currentDomainBaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
      _logger.Info($"调用{processName} ,空间路径:{currentDomainBaseDirectory}");
      var args = "-instance \"WUTY\"";
      StartProcess(processName, currentDomainBaseDirectory, args);
      await Task.Delay(100);
  }

 

2、为了避免在启动弹出UAC的管理员权限的弹窗,需要在服务端,执行注册Everything的实例脚本:localReachServiceInstall.bat

cd /d %~dp0
Everything.exe -instance "WUTY" -uninstall-service 
Everything.exe -instance "WUTY" -install-service
sc failure Everything reset= 30 actions= restart/5000 >>InstallLog.txt
exit

 

3、配套的es查询也需要指定 instance  查询

  /// <summary>
  /// 搜索文件
  /// <returns>返回路径</returns>
  /// </summary>
  private async Task<string> SearchFileAsync(string content)
  {
      await StartEverythingAsync();
      string cmd = $"es.exe -instance \"WUTY\" {content}";
      var currentDomainBaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
      _logger.Info($"调用{cmd} ,路径:{currentDomainBaseDirectory}");

      return await RunCmdAsync(cmd, currentDomainBaseDirectory);
  }

 效果如下图:

img_v3_02pk_013f372e-75c6-4967-99da-883c22afaceg

 

posted @ 2025-08-29 17:52  wuty007  阅读(53)  评论(1)    收藏  举报