炳裘垦 发表于 7 天前

Everything 支持 多实例 运行

出现的问题

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

 
排查问题

查阅了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、配套的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);
} 效果如下图:

 

来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除
页: [1]
查看完整版本: Everything 支持 多实例 运行