dsh-win-pwsh7

中文文档
0.2.5发布于 2026/11/03MITES Module零依赖构建来源已验证

在Windows上检测和验证PowerShell 7中的Harness pwsh工具,并根据请求通过微软商店安装它-脚本或手动-而pwsh工具一直被阻止,直到PowerShell 7运行时真正解决。

中文使用文档
文档目录18 节
  1. 验证环境
  2. 它不做什么
  3. 与 dsh-ops 共存
  4. 安装本插件
  5. 两种安装方式
  6. 连续失败熔断
  7. 配置
  8. 推荐搭配
  9. 报告示例
  10. 插件页
  11. Windows UTF-8 控制台(过渡层)
  12. 删除契约
  13. 判定上游已修复
  14. 禁用或卸载
  15. 故障排查
  16. 验证
  17. 设计约束
  18. License

dsh-win-pwsh7

简体中文 · English

把真正的 PowerShell 7 交给 Windows 上的 Harness pwsh 工具,而不是悄悄退回 Windows PowerShell 5.1。

  1. 检测这台机器上的 PowerShell 7(含可选的 overridePath);
  2. 校验显式路径(pwsh7_status 的 path 参数);
  3. 安装:脚本安装(pwsh7_install 打开 Microsoft Store 页面并点击安装)或手动安装(Win+R 打开同一个 Store 链接)。没有启动时自动安装。

启用本插件期间,pwsh 工具只在实际执行器解析到 PowerShell 7+ 时才放行;否则每次调用在 dispatch 之前被 ctx.tools.guard 拒绝,错误文案给用户三条路:配置已装的 PowerShell 7 / 安装 / 禁用插件,并且不会启动任何 PowerShell 进程。禁用插件即移除 gate,之后由默认执行器自行选择运行时,插件仍然不写 pwshPath。

验证环境

  • Windows 10/11。
  • 已在 DSH 0.2.1-rc.3 上验证(见 package.json 的 dsh.verifiedAgainst)。
  • 脚本安装需要 Microsoft Store 可用;手动安装只需要能打开 Store 页面。
  • 不需要管理员权限。

它不做什么

  • 不在启动时自动安装。
  • 不写执行器的 pwshPath;只会在开启共存时写一条带标记的 dsh-ops 兼容覆盖。
  • 不卸载由 Store 安装的 PowerShell 7。
  • 不做 VPN 自动检测,也不做计量连接预检。

与 dsh-ops 共存

默认开启。启用由 cordis.patch.yml 的声明式 dsh-ops-compat 覆盖负责:只要 dsh-win-pwsh7 的 bundle 安装且位于 dsh-ops 之后,重启 DSH 后官方 pwsh 恢复,ops_bash 保留。关闭开关时只写入一条带标记的 disable override;卸载 bundle 后启用覆盖消失,cleanup 会尽力删除 disable override。

0.2.1 的桥接层在计算隐藏集合时读取了限制后的可见工具,会在隐藏/恢复之间振荡并卡死宿主;0.2.2 改为读取限制前的 knownNames / restrictableNames,并过滤 tools.restrict() 不接受的名字。多会话验证通过后已恢复默认开启。

桥接层还会在对应 OPS 工具可见时隐藏官方 read / glob / grep,以及重复的官方 bash / pwsh_persistent,让工具面保持 pwsh + ops_bash。桥接实现独立在 lib/dsh-ops-bridge.js,删除该模块和入口挂载即可移除。

安装本插件

# 从 GitHub 安装(推荐锁定 tag)
dsh plugin --profile desktop add github:XinSpark/dsh-win-pwsh7#v0.2.5
# 或 npm
dsh plugin --profile desktop add dsh-win-pwsh7

装完重启 DSH。需要接线时,把 pwsh7_status 给出的 profile 补丁整段粘进 ~\.dsh\profiles\<profile>\cordis.patch.yml 再重启;插件不会替你写执行器的 pwshPath。

两种安装方式

方式说明
脚本安装调用 pwsh7_install。插件先要求用户确认没有开启 VPN(vpnOffConfirmed: true);随后打开 Microsoft Store 的 PowerShell 7 页面,先弹一个说明框(不要关闭商店窗口;VPN 开启请取消),再用 Windows UI Automation 点「安装」/「获取」/「Install」/「Get」。
手动安装Win+R → 粘贴 ms-windows-store://pdp/?ProductId=9MZ1SNWT0N5D → 回车 → 点「安装」。手动安装会被插件自动识别,无需 pin。

脚本安装的 Store 页面 90 秒内没有出现安装按钮时,报告会要求用户先确认 VPN:关闭 VPN、完全退出并重启 Microsoft Store,然后重试;或改用手动安装。

连续失败熔断

同一个 Host 进程内,连续 3 次脚本安装失败后:

  • 下一次 pwsh7_install 不再启动作业;
  • 先要求用户检查网络,尤其是 VPN;
  • 只有用户明确回复“问题已解决”后,模型才可以带 userConfirmedFixed: true 再试一次;该参数会清零计数;
  • 若再次连续失败 3 次,继续熔断;
  • 其余情况改用手动安装。

计数只存在当前进程,重启 DSH 后清零。

配置

键默认说明
overridePath未设优先级①的显式 pwsh.exe。必须能启动并报告 PowerShell 7+;未通过校验就回落到自动探测。只影响探测与推荐,不接线。
dshOpsCompattrue与 dsh-ops 共存(默认开启):自动写入并启用兼容模式,隐藏重复的官方工具,保留 pwsh + ops_bash。需要重启。
utf8Consoletrue过渡层:Windows 下给 pwsh 工具的每条命令前加 chcp.com 65001,避免嵌套 pwsh -File 按 936 输出 GBK 后被按 UTF-8 解码成乱码。宿主修复后可删除。

overridePath 是 volatile():插件页配置区保存即生效;也可以写进 profile 补丁:

- id: win-pwsh7
  config:
    overridePath: 'D:\tools\pwsh\pwsh.exe'

推荐搭配

脚本安装完成后,作业结果会包含一条给模型的指令:必须向用户推荐搭配 dsh-ops(https://github.com/T-Auto/dsh-ops)插件使用,效果更佳;由模型询问用户是否安装,不得未经同意自动安装。安装命令:

dsh plugin --profile <profile> add dsh-ops

推荐只出现在脚本安装完成的作业结果里;pwsh7_status 和手动安装不会反复推荐。

报告示例

pwsh7_status 返回下面的文本报告;插件页把同一份状态渲染成卡片,不直接铺开整段文本。

Executor rows:
  pwsh-sandbox : pwshPath = C:\Users\...\WindowsApps\Microsoft.PowerShell_8wekyb3d8bbwe\pwsh.exe (PowerShell 7.6.9, Store family alias)

The pwsh tool currently runs on PowerShell 7.6.9 via the executor (…).
The executor resolves to the version-stable Store family alias: … Nothing to configure.

没有可用运行时时,报告以 Three ways forward: 结束:安装 / 配置执行器 / 禁用插件。

插件页

插件页的状态区是原生卡片,显示状态、运行时和执行器路径,右上角有「重新检测」;配置区有 overridePath 和默认开启的「与 dsh-ops 共存」原生开关。

Windows UTF-8 控制台(过渡层)

DSH 的 pwsh 工具按 UTF-8 解码输出,但命令里再启动的 pwsh -File / powershell -File 会继承控制台代码页(简体中文机器通常是 936),输出 GBK,最终显示为 �。宿主的前缀只固定了外层进程的 .NET 编码,没有改控制台代码页。

0.2.5 增加一个过渡层:包装 pwsh 工具使用的 ctx.shell.execute,在 Windows 上给每条命令前加 chcp.com 65001 > $null;。它只影响装了本插件的用户;默认开启,可用 utf8Console: false 关闭;宿主接口形状不符时 fail-open,不影响 pwsh 工具本身。

删除契约

宿主发布同样的修复后,按这五步整块删除:

  1. 删 lib/utf8-console-bridge.js;
  2. 删 index.js 的 import 和 mountUtf8ConsoleBridge(ctx, current) 调用;
  3. 删 Config.utf8Console;
  4. 删 tools/check-utf8-bridge.mjs,并从 package.json 的 check 链里移除;
  5. 删本节和 CHANGELOG 里的 0.2.5 过渡说明。

验收:grep -rn "utf8-console-bridge\|utf8Console" index.js lib tools 无结果。

判定上游已修复

满足任一条件即可开始删除:

  • @deepseek-ai/dsh-pwsh-local 的 ENCODING_PREAMBLE 自己包含 chcp.com 65001(可查上游 packages/shell/pwsh-local/src/index.ts,或安装包里的 lib/index.js);
  • 在 CP936 控制台下,不装/关闭本插件时,命令里嵌套的 pwsh -File 已经输出 UTF-8。

删除前先在真实的 CP936 环境复跑一遍嵌套脚本,确认不再需要这层。

禁用或卸载

禁用插件只移除 pwsh 的 gate 和插件页,不会卸载 PowerShell 7。只要机器上仍有 pwsh.exe,默认执行器仍会优先运行它(通常是 Store 版 PowerShell 7);只有找不到 pwsh.exe 时才回退到 Windows PowerShell 5.1。要真正回到 5.1,需要卸载 Store 版或把执行器 pin 到 powershell.exe,不推荐这样做。

故障排查

现象处理
Store 页面打开但没有「安装」按钮确认 VPN 已关闭,完全退出并重启 Microsoft Store 后重试;或改用手动安装。
pwsh 仍运行 5.1运行 pwsh7_status,按报告把 pwshPath 补丁粘进 profile 并重启;或安装 Store 版。
插件页看不到确认当前 profile 已启用 dsh-win-pwsh7,然后重启 DSH。
命令里嵌套 pwsh 时中文变 �0.2.5 默认已由 utf8Console 过渡层处理;若手动关掉,重新开启,或在命令前加 chcp.com 65001 > $null;。

验证

$env:DSH_APP_DIR = 'E:\FXS\APP\DSH NEXT\resources\app.asar'
node tools/check-host.mjs
node tools/check-client.mjs
node tools/check-utf8-bridge.mjs
node tools/check-native-contracts.mjs

四套门都可以在打包安装(resources/app.asar)上离线复跑;DSH_APP_DIR 接安装根目录、resources/app 或 resources/app.asar。

设计约束

  • 判定读执行器自己的 ctx.shell.pwshPath,不是扫配置行;overridePath 只影响探测与推荐。
  • 不做 VPN 自动检测、不做计量连接预检;VPN 由用户在安装前确认,页面加载失败时再提示。
  • 不自动重试;连续失败由熔断终止。
  • 提交前跑四套门;端到端安装是发布证据,不是自动化门的一部分。

License

MIT

版本与发布记录

dsh-win-pwsh7 共发布 8 个版本,首次发布于 2026/10/14;过去 12 个月发布了 8 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.2.5latest2026/11/03今天
0.2.42026/10/295 天前
0.2.32026/10/286 天前
0.2.02026/10/286 天前
0.12.32026/10/1915 天前
0.12.22026/10/1816 天前

关于 dsh-win-pwsh7 的常见问题

dsh-win-pwsh7 是什么?

在Windows上检测和验证PowerShell 7中的Harness pwsh工具,并根据请求通过微软商店安装它-脚本或手动-而pwsh工具一直被阻止,直到PowerShell 7运行时真正解决。

如何安装 dsh-win-pwsh7?

在项目目录运行 npm install dsh-win-pwsh7,或使用 pnpm add / yarn add / bun add。

dsh-win-pwsh7 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/dsh-win-pwsh7 是否存在。

dsh-win-pwsh7 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

dsh-win-pwsh7 可以商用吗?

dsh-win-pwsh7 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

dsh-win-pwsh7 还在维护吗?

最新版本 0.2.5 发布于 2026/11/03(今天);至今共发布 8 个版本,其中过去 12 个月发布了 8 个;首次发布于 2026/10/14。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。