修正AI生成的PowerShell和批处理脚本编码和换行符格式错误
在使用Deepseek、GoogleAI、千问、百度文心在生成批处理脚本和Powershell脚本且含有中文时,不管是通过复制粘贴代码还是下载、或者由powershell生成脚本生成的,经常会出现执行异常如下图:

解决也很简单,让代码成功运行的两个关键点:
- 换行符统一为 CRLF:从聊天窗口复制到 PowerShell 的 here-string,换行符是 LF。
WriteAllText会原样写入,导致 CMD 解析错位。加上-replace修正后就正常了。 - 编码用 GBK:
[System.Text.Encoding]::GetEncoding(936)确保中文在 CMD 下不乱码。
下面两个模板可以保存到当前目录,生成的文件也会在当前目录,也可以指定路径。
通用脚本生成模板(以后可以直接套用)
以后凡是要生成 .bat 脚本,请用下面这个模板。只需替换 $path 和目标文件名即可。
将下面代码保存为”单脚本生成模板.ps1″
$path = "你的脚本.bat"
$content = @'
在这里粘贴脚本内容
'@
# 关键两步:统一 CRLF + GBK 编码
$content = $content -replace "`r`n", "`n" -replace "`n", "`r`n"
[System.IO.File]::WriteAllText($path, $content, [System.Text.Encoding]::GetEncoding(936))
Write-Host "已生成: $path (CRLF + GBK)"
如果是一次性写入多个脚本
将下面代码保存为”多个脚本生成模板.ps1″
function Write-BatFile {
param(
[string]$Path,
[string]$Content
)
$Content = $Content -replace "`r`n", "`n" -replace "`n", "`r`n"
[System.IO.File]::WriteAllText($Path, $Content, [System.Text.Encoding]::GetEncoding(936))
Write-Host "已生成: $Path"
}
$content1 = @'
@echo off
echo 第一个脚本
'@
$content2 = @'
@echo off
echo 第二个脚本
'@
Write-BatFile -Path "Script1.bat" -Content $content1
Write-BatFile -Path "Script2.bat" -Content $content2
为什么必须这样做
| 环节 | 问题 | 解决 |
|---|---|---|
| 聊天窗口复制 → PowerShell | 换行符是 LF | -replace 转 CRLF |
PowerShell WriteAllText | 默认不转换换行符 | 显式替换 |
| 编码 | UTF-8 导致 CMD 乱码 | 用 Encoding.GetEncoding(936) |
| 记事本保存 | 可能改回 UTF-8 或保留 LF | 避免用记事本二次编辑 |
验证脚本是否正常
生成后,用以下命令检查:
powershell
# 检查换行符 (Get-Content $path -Raw) -match "`r`n" # 应为 True # 检查编码(前 3 字节不是 239,187,191 即可) (Get-Content $path -Encoding Byte -TotalCount 3) -join ","
对AI的训练
明确要求今后凡是给你提供 .bat / .cmd / .ps1 脚本时,必须:
- 默认在生成指令里加入 CRLF 替换和 GBK 编码,不让你再手动补。
- 提示你使用 PowerShell 写入,而不是记事本保存。
- 验证方式一并给出,方便你快速确认文件正常。















