dsh-win-pwsh7
报告 DSH 的 pwsh 执行器实际运行的 PowerShell(只认启用中的行,带版本号的商店路径不会被推荐为 pin),并通过脚本点击商店页面或手动商店路径安装由商店管理的 PowerShell 7。只有实际执行器解析到 PowerShell 7+ 时才放行 pwsh 工具;检测到 dsh-ops 时启用其 Compatibility 模式,保留原生 pwsh 与 ops_bash 并存,并隐藏重复的官方工具。Web 界面提供原生状态卡片和配置开关;仅 Windows,零运行时依赖。
安装
dsh plugin --profile web add dsh-win-pwsh7
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-win-pwsh7
<p align="center"><sub>简体中文 · <a href="README.en.md">English</a></sub></p>
把真正的 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.2-rc.1 上验证(见
package.json的dsh.verifiedAgainst)。 - 支持范围
>=0.2.1-rc.3 <0.3.0-0:收紧到"下一个预发布"会让 loader 在 DSH 每次小版本更新后静默跳过本插件
(不装、不报错、pwsh 失去 gate 和 UTF-8 过渡层),所以上界按次版本划。
- 脚本安装需要 Microsoft Store 可用;手动安装只需要能打开 Store 页面。
- 不需要管理员权限。
完整文档见 [docs/README.md](docs/README.md);私有维护材料不随包发布。npm 包页上的相对文档链接可能 404,以 GitHub 仓库为准。
它不做什么
- 不在启动时自动安装。
- 不写执行器的
pwshPath;与 dsh-ops 的共存由 dsh-ops 0.5.0+ 的原生「dsh-win-pwsh7 联动」负责,本插件不写 profile 补丁,也不隐藏工具。 - 不卸载由 Store 安装的 PowerShell 7。
- 不做 VPN 自动检测,也不做计量连接预检。
与 dsh-ops 共存
从 0.2.8 起,共存交给 dsh-ops 自己:dsh-ops 0.5.0+ 检测到本插件后会自动打开「dsh-win-pwsh7 联动」,保持官方 pwsh 可见,ops_bash 继续发布;官方 read / glob / grep 由 dsh-ops 的预设开关隐藏。本插件不再写 cordis.patch.yml、不写兼容覆盖,也不在 agent 作用域隐藏工具。
需要 dsh-ops 0.5.0 或更高版本。旧版 dshOpsCompat 开关和 dsh-ops-compat 覆盖已在 0.2.8 移除;如果旧版本在 profile 补丁里留下带 # dsh-win-pwsh7: ... (managed) 的块,升级后手动删除。联动开关位于 dsh-ops 插件页的「其他」区;关闭后按 dsh-ops 自己的策略隐藏宿主 pwsh。
历史:0.2.1 的桥接层在计算隐藏集合时读取了限制后的可见工具,会在隐藏/恢复之间振荡并卡死宿主;0.2.2 改为读取限制前的 knownNames / restrictableNames。该桥已在 0.2.8 整体删除,经验留在[项目经验](docs/experience/02-隐藏恢复振荡.md)。
安装本插件
# 从 GitHub 安装(推荐锁定 tag) dsh plugin --profile desktop add github:XinSpark/dsh-win-pwsh7#v0.2.8 # 或 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+;未通过校验就回落到自动探测。只影响探测与推荐,不接线。
utf8Console · true · 过渡层: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 桥删除,由 dsh-ops 页面管理)。页面最底部(状态卡下方、页脚「查看仓库」之前)有一行求星提示(⭐ 字符,文案跟随界面语言;不重复造仓库链接)。
多语言
插件自有文案跟随 DSH 的 8 种官方语言实时切换:中 / 英 / 日 / 德 / 西 / 法 / 葡 / 俄。
界面字典在 client.js(DICT_ZH / DICT_EN / DICT_JA / DICT_DE / DICT_ES / DICT_FR /
DICT_PT / DICT_RU),包标题与描述在 locale/*.json,每种语言一份。
- 中 / 英为人工撰写;日 / 德 / 西 / 法 / 葡 / 俄为机器翻译(人工粗校),个别措辞可能不自然——欢迎提 Issue/PR 纠正;
- **只改
locale/*.json的包标题/描述需要重启 DSH**:宿主在启动时读取这份元数据,刷新页面不会变;
client.js 里的界面字典刷新页面即可生效;
- 新增文案必须同时补齐 8 本字典;
npm run check的 client 门会强校验键集一致、非空、en无 CJK,以及 8 份 locale meta。
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;
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:8,最后更新 2026-11-06