我编写了一个 Powershell 脚本,允许用户从列表中选择某些内容。然后将其与批处理文件的代码组合,然后输出该批处理文件。 这一切都很完美,批处理文件中的代码是正确的,它正确保存为批处理文件,但是当我通过双击批处理文件来运行它时,它会在屏幕上闪烁一个框一秒钟,然后消失,没有运行它应该做的事情。
但是,如果我将相同的文本复制并粘贴到记事本中,另存为完全相同的内容并双击它,它就会正确执行。我该如何解决这个问题?
尝试将批处理文件的内容复制并粘贴到记事本中并另存为 test.bat - 然后工作正常。
if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
$x = $listBox.SelectedItem
$out = "@echo off ........."
$out | Out-File -FilePath C:\temp\test.bat
}
它不是执行批处理文件,而是只是在屏幕上瞬间闪烁一个框。
应该发生的是批处理文件执行其脚本中的代码。 批处理文件既有暂停又有超时,它也无法完成它应该执行的任务。
Lee_Dailey在评论中提供了关键点:
Out-File
(和 >
)默认在 Windows PowerShell[1] 中创建“Unicode”文件,即 UTF-16LE 编码文件,而处理批处理文件的 shell cmd.exe
则不会听不懂。
cmd.exe
需要 OEM 编码的文件,即与活动(旧)系统区域设置关联的 OEM 代码页。 (OEM 代码页是 7 位 ASCII 编码的 8 位超集)。
因此,您应该使用
-Encoding Oem
创建批处理文件:
$out = "@echo off ........."
$out | Out-File -Encoding Oem -LiteralPath C:\temp\test.bat
由于您要输出 strings,因此您也可以使用
Set-Content
,这稍微更有效。
[1] 在跨平台 PowerShell Core 版本中,更明智的默认值是 UTF-8(无 BOM)。