SuperAPI AI 工具集

powershell-safe-invocation

部署与运维

查看项目

更新于 10-16 03:05

技能介绍

用途:本资料提供在 Windows 上安全编写和运行 PowerShell 的规则,涵盖调用原生程序、带空格的路径、转义、pwsh、Start-Process 和文件操作,目标是在各解析层边界处保持调用清晰可靠。

版本区分:除非明确需要 Windows PowerShell 5.1,应使用 PowerShell 7 的 pwsh.exe。不确定当前 shell 时,可用 $PSVersionTable.PSVersion 与 $PSNativeCommandArgumentPassing 验证。注意 pwsh.exe 对应 PowerShell 7,powershell.exe 对应 Windows PowerShell 5.1,安装 PowerShell 7 不会让 powershell.exe 变成 7。

原生程序:不要把参数拼成一个大命令字符串。应把可执行文件路径存入变量,用数组保存每个参数,再用 & $exe @args 调用,并立即捕获 $LASTEXITCODE、在非零时抛错。每个原生参数视为一个数组项;避免 Invoke-Expression,避免仅为启动可执行文件而加 cmd.exe /c 层,也不要用 Bash 风格转义。

Cmdlet:对 PowerShell cmdlet 使用哈希表 splatting。真实路径优先用 -LiteralPath,除非有意做通配符展开。不要用 $LASTEXITCODE 判断 cmdlet 结果,应使用终止性错误,例如设置 $ErrorActionPreference = 'Stop'。

复杂命令:避免像 cmd.exe /c pwsh.exe -Command "..." 这类深层引号命令。涉及多行代码、嵌套引号、JSON、XML、正则、管道、重定向或非 ASCII 路径时,应写临时 .ps1 文件,再用 pwsh.exe -NoLogo -NoProfile -NonInteractive -File script.ps1 执行;超过简短表达式时优先 -File 而非 -Command。不要无故添加 -ExecutionPolicy Bypass。

字符串与多行:字面字符串和路径用单引号,需要展开时用双引号。避免反引号续行,改用数组、哈希表、splatting、括号或脚本块。JSON 应先生成对象再用 ConvertTo-Json,不要手工转义。字面多行文本用单引号 here-string;供其他工具消费时显式指定编码。

Start-Process:正常前台执行用 & $exe @args。仅在需要提权、新窗口/隐藏窗口、分离启动或 shell 行为时用 Start-Process,因其 -ArgumentList 会把值连接成命令行字符串,不是可靠的结构化参数接口。需要独立进程且参数复杂时,使用 ProcessStartInfo 并将每个参数加入 ArgumentList,再启动、等待退出并检查退出码。

文件操作:递归删除、移动或覆盖前,应解析绝对根路径与目标路径,确认目标位于预期根内,拒绝空路径、根级路径或异常路径,并把文件系统修改保留在 PowerShell 内。

决策顺序:优先 PowerShell cmdlet,其次 & $exe @args,再是临时 .ps1 加 pwsh.exe -File,之后是 ProcessStartInfo.ArgumentList,然后才是 Start-Process,仅当需要 cmd 语义时用 cmd.exe /c,Invoke-Expression 只作为严格控制下的最后手段。