Powershell 正在输出无法运行的批处理文件

问题描述 投票:0回答:1

我编写了一个 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
}

它不是执行批处理文件,而是只是在屏幕上瞬间闪烁一个框。

应该发生的是批处理文件执行其脚本中的代码。 批处理文件既有暂停又有超时,它也无法完成它应该执行的任务。

powershell batch-file export
1个回答
0
投票

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)。

© www.soinside.com 2019 - 2024. All rights reserved.