
关于
Windows 上可靠的命令执行:路径、编码和常见二进制文件陷阱的最佳实践。
name: windows-shell-reliability description: "Windows上的可靠命令执行:路径、编码和常见二进制陷阱。" risk: safe source: community date_added: "2026-03-19"
Windows Shell 可靠性模式
通过PowerShell和CMD在Windows上运行命令的最佳实践。
何时使用
在开发或调试运行在Windows系统上的脚本和自动化时使用,特别是涉及文件路径、字符编码或标准CLI工具时。
1. 编码与重定向
关键:不同PowerShell版本的重定向差异
旧版Windows PowerShell可能以破坏后续处理的方式重写原生命令输出。PowerShell 7.4+在重定向stdout时保留字节流,因此仅在处理旧版shell行为或已不可读的日志文件时应用UTF-8转换。
| 问题 | 症状 | 解决方案 |
|------|------|----------|
| dotnet > log.txt | 旧版PowerShell中文件不可读 | Get-Content log.txt \| Set-Content -Encoding utf8 log_utf8.txt |
| npm run > log.txt | 需要含错误的UTF-8日志 | npm run ... 2>&1 \| Out-File -Encoding UTF8 log.txt |
规则: PowerShell 7.4+优先使用原生重定向,仅在旧版产生不可读日志时使用显式UTF-8转换。
2. 处理路径和空格
关键:引号
Windows路径经常包含空格。
| 错误 | 正确 |
|------|------|
| dotnet build src/my project/file.fsproj | dotnet build "src/my project/file.fsproj" |
| & C:\Path With Spaces\bin.exe | & "C:\Path With Spaces\bin.exe" |
规则: 始终为可能包含空格的绝对和相对路径加引号。
调用运算符 (&)
在PowerShell中,如果可执行文件路径以引号开头,必须使用 & 运算符。
& "C:\Program Files\dotnet\dotnet.exe" build ...
3. 常见二进制和Cmdlet陷阱
| 操作 | CMD风格 | PowerShell选择 |
|------|---------|----------------|
| 删除 | del /f /q file | Remove-Item -Force file |
| 复制 | copy a b | Copy-Item a b |
| 移动 | move a b | Move-Item a b |
| 创建目录 | mkdir folder | New-Item -ItemType Directory -Path folder |
4. Dotnet CLI 可靠性
| 场景 | 命令 | 原因 |
|------|------|------|
| 快速迭代 | dotnet build --no-restore | 跳过冗余nuget恢复 |
| 干净构建 | dotnet build --no-incremental | 确保无过期制品 |
| 后台运行 | Start-Process dotnet -ArgumentList 'run' -RedirectStandardOutput output.txt | 不阻塞shell并保留日志 |
5. 环境变量
| Shell | 语法 |
|-------|------|
| PowerShell | $env:VAR_NAME = "value" |
| CMD | set VAR_NAME=value |
| 跨平台 | 使用 .env 文件 + dotenv库 |
6. 错误处理
$ErrorActionPreference = "Stop"
try {
dotnet build
} catch {
Write-Error "构建失败: $_"
exit 1
}
规则: 在脚本顶部设置 $ErrorActionPreference = "Stop" 确保错误不被静默忽略。