Bundle
dsh-tool-pwsh-safe
Elbow-proof PowerShell for DeepSeek Harness: run multiline pwsh scripts via -EncodedCommand, immune to quoting/escaping pain.
- Source
- sryimnoob123
- stars
- 1 stars
- License
- MIT
- Updated
- Updated 13 days ago
Readme
# 🥊 dsh-tool-pwsh-safe
> **你是否见过 dsh 疯狂肘击 PowerShell?**
单引号、双引号、反斜杠、`$` 展开、反引号、换行、中文……
每个 AI agent 都曾在 PowerShell 转义地狱里被肘击到怀疑人生。

## 这是什么
`dsh-tool-pwsh-safe` 是一个 DSH 工具插件:模型要跑 PowerShell 时,把整个脚本**原样**交给我,剩下的转义问题我来扛。
```text
你的脚本(多行随便写)
↓
base64 编码(纯 ASCII,引号/$/反斜杠全部变安全字符)
↓
走 DSH 沙箱化 pwsh 执行器(ctx.shell,和内置 pwsh 同一条通道)
↓
结果带沙箱标记 / 完整输出 spill 落盘路径 / 退出码
```
## 对比:肘击 vs 不肘击
| 场景 | 内置 pwsh 的日常 | pwsh_safe |
| --- | --- | --- |
| 想输出 `他说:"你好"` | 转义套转义,祈祷能跑 | 原样写,原样跑 |
| 多行脚本 | 每行拼接、层层转义 | 整段直接贴 |
| `$env:PATH -replace ';',';'` | 连环事故 | 没事发生 |
| 中文输出 | 乱码/编码错误 | UTF-8 编码,稳 |
## 特性
- 走 **DSH 沙箱通道**:和内置 `pwsh` 工具同一执行器,沙箱策略 / ConstrainedLanguage / 权限升级全部生效
- **长输出自动 spill**:超限不丢,完整输出落盘并报告路径
- **超时保护**:默认 120s,可自定义
- **脚本长度守卫**:脚本转 base64 后超过 24000 字符会直接报错提示拆分,避免撞上 Windows 命令行 32KB 上限
- **结果规范化**:执行器返回形状异常时也会被归一化,不会因缺字段崩渲染
- **中文友好**:UTF-8 全链路
- **零依赖**:无 @deepseek-ai 依赖,纯 Node 内置
## 安装
```bash
cd $DSH_HOME/profiles/<你的profile>
pnpm add dsh-tool-pwsh-safe@github:sryimnoob123/dsh-tool-pwsh-safe
# 或本地开发:pnpm add link:/绝对路径/dsh-tool-pwsh-safe
```
然后把它加进 profile 的 `package.json` bundles 列表,重启 DSH。
## 使用
```json
{
"script": "Write-Host \"这是中文 + 引号 + $env:USERNAME\"; Get-Location",
"description": "演示转义免疫"
}
```
## 配置
| 参数 | 默认 | 说明 |
| --- | --- | --- |
| `script` | (必填) | 完整 PowerShell 脚本,多行随便 |
| `description` | (必填) | 一句话说明(UI 显示用) |
| `workdir` | 会话工作目录 | 脚本工作目录 |
| `timeoutMs` | 120000 | 超时自动 kill |
## License
MITInstall
dsh plugin --profile web add github:sryimnoob123/dsh-tool-pwsh-safe
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-tool-pwsh-safe from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.