出现的问题
我们项目组做了一个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);
- }
复制代码 效果如下图:
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |