惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
D
Docker
月光博客
月光博客
MongoDB | Blog
MongoDB | Blog
Vercel News
Vercel News
美团技术团队
博客园 - 叶小钗
I
InfoQ
Jina AI
Jina AI
博客园 - 司徒正美
雷峰网
雷峰网
B
Blog
Y
Y Combinator Blog
A
About on SuperTechFans
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
Microsoft Security Blog
Microsoft Security Blog
Stack Overflow Blog
Stack Overflow Blog
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recent Announcements
Recent Announcements
V
V2EX
N
Netflix TechBlog - Medium

博客园 - wuty007

我让AI帮忙做了一个“全国产品质量鉴定法规监测”Skill WPF + OpenCvSharp 实现摄像头、RTSP 人脸与动物检测跟踪 TelegramConsole C# 范围运算符 C# 调用WGC 实现桌面屏幕的捕获 完善基于WPF开发的标尺控件(含实例代码) C# 依赖注入 Microsoft.Extensions.DependencyInjection 实现 控制反转(IOC) C# 获取Windows系统的设备名称 记录 Windows系统开启hyper-v ,部分端口被保留,导致端口不能使用而报错的问题 WPF 调用 Win32的SetWindowDisplayAffinity 函数 实现捕获屏幕时,过滤指定的窗口 记录WPF 在清单列表设置了UIACESS为true,没有签名的报错“从服务器返回了一个参照” WPF 的ListBox 去除默认的Item项的 鼠标hover的背景颜色 WPF 调用 ChangeWindowMessageFilterEx 修改指定窗口 (UIPI) 消息筛选器的用户界面特权隔离 记录一下 WPF进程 SendMessage 发送窗口消息进行进程间通信,存在进程权限无法接受消息的问题 记录 使用PsExec启动System权限的WPF 程序 记录 命令行的 findstr 的使用 排查Windows 下的内存使用率过高,但是任务管理器看不到进程 指定应用 在 控制面板或者 设置的安装应用 置灰或隐藏卸载按钮 WPF 通过RawInput 获取 系统全局触摸事件 C# 定时任务 Quartz.NET 的使用 记录一下Windows系统下的命令行参数的字符个数限制 WPF 实现支持动态调整高度的文本显示控件
Everything 支持 多实例 运行
wuty007 · 2025-08-29 · via 博客园 - wuty007

出现的问题

我们项目组做了一个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