【问题标题】:German Umlauts in Powershell called by vbs由 vbs 调用的 Powershell 中的德语变音符号
【发布时间】:2021-03-26 01:58:57
【问题描述】:

我确实有一个 ps1 文件,它会创建一个链接

create-link.ps1

$path = $env:HOMESHARE + "\My Projects\"
If(!(test-path $path))
{
    New-Item -ItemType Directory -Force -Path $path
}

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($env:HOMESHARE + "\My Projects\" + "linkname.lnk")
$Shortcut.TargetPath = "\\path\for\link"
$Shortcut.Description = "äöüß"
$Shortcut.IconLocation = $env:SYSTEMROOT + "\\system32\\shell32.dll,3"
$Shortcut.Save()

我也有一个调用 ps1 的 vbs 文件

create-link.vbs

command = "powershell.exe Get-Content ""C:\path\to\file\create-link.ps1"" | PowerShell.exe -noprofile"
set shell = CreateObject("WScript.Shell")
shell.Run command,0

这两个文件都使用 utf-8 编码保存。

这种结构是必要的,因为 ps1 需要完全无头运行,而不需要用户注意任何事情。通过 vbs 调用 ps1 解决了这个问题,如果有更好的方法,如果你让我知道,我会很高兴。

如果我直接调用 powershell 脚本或使用 "powershell.exe Get-Content ""C:\path\to\file\create-link.ps1"" | PowerShell.exe -noprofile" (通过使用 cmd)一切正常。 但是,如果我调用 vbs 来完成它通常可以工作的工作,但是“描述”中的德语变音符号只是问号,所以不知何故编码被打乱了。有没有办法解决这个问题?

【问题讨论】:

标签: windows powershell shell vbscript character-encoding


【解决方案1】:

tl;博士:

  • 将您的 *.ps1 文件保存为 UTF-8 带有 BOM

  • 使用 PowerShell CLI-File 参数简化您的命令:

command = "powershell.exe -NoProfile -File ""C:\path\to\file\create-link.ps1"""

另请参阅:GitHub issue #3028,它要求能够完全隐藏启动 PowerShell 自身 - 无需辅助。 VBScript 脚本 - a future version may support(但不会向后移植到 Windows PowerShell)。


如果您使用的是 Windows PowerShell(版本最高为 v5.1),则必须将 *.ps1 文件保存为 UTF-8 带有 BOM 以便针对 ASCII(7 位)范围之外的字符(例如 äöüß)正确解释它们。
这在 PowerShell [Core] v6+ 中不再需要,它始终默认为 UTF-8,但如果您的脚本需要在 both 版本中运行,则应始终使用 UTF -8 与 BOM.

如果给定的*.ps1 没有 BOM,Windows PowerShell 会解释作为 UTF-8 编码序列一部分的每个字节(所有非 ASCII 字符都被编码为 2-4 bytes)单独作为一个字符,基于系统的活动 ANSI 代码页(单字节编码,例如 Windows-1252)。

在美国英语系统上,活动的 ANSI 代码页是 Windows-1252,因此上述示例字符串显示为垃圾字符串 äöüß

请注意,问号,或者更准确地说, 的实例(替换字符,U+FFFD)只会在 reverse 场景中出现:当 ANSI 编码的文本被误解为UTF-8。


顺便说一句,您通过管道 (stdin) 向 PowerShell CLI 提供源代码的方法

由于您的脚本显然是隐藏的,它不会对您的情况产生影响,但请注意,此技术展示了伪交互模式,也不支持将 参数 传递给正在运行的脚本通过标准输入提供 - 请参阅 GitHub issue #3223

【讨论】:

  • 另外,作为一种快速而肮脏的解决方法,您可以用 unicode 替换变音符号,因此 '"Brücke" ' 变为 ' "Br" + " + [char]0x00FC + "cke" '跨度>
  • @bob 绝不会建议这样做,即使是快速而肮脏的 hack。见过太多人没有正确对待编码,这样的黑客也好不到哪里去。
  • @Lankymark 我完全同意,但我需要一个非常快速的“现在必须工作”的解决方案,同时开发一个更好的解决方案并稍后切换
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 2016-01-21
相关资源
最近更新 更多