vbs调用的Powershell中的德语元音变音符



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

创建链接.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 = "\pathforlink"
$Shortcut.Description = "äöüß"
$Shortcut.IconLocation = $env:SYSTEMROOT + "\system32\shell32.dll,3"
$Shortcut.Save()

我也有一个vbs文件,它调用ps1

创建链接.vbs

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

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

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

如果我直接调用powershell脚本;powershell.exe获取内容"quot;C: \path\to\file\create link.ps1"|PowerShell.exe-noprofile"(通过使用cmd(一切正常。然而,如果我调用vbs来完成工作,它通常是有效的,但"Description"中的德语元音变音符只是问号,所以不知何故编码被打乱了。有什么办法解决这个问题吗?

tl;dr:

  • 使用BOM将*.ps1文件保存为UTF-8

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

command = "powershell.exe -NoProfile -File ""C:pathtofilecreate-link.ps1"""

另请参阅:GitHub问题#3028,它要求能够完全隐藏地启动PowerShell本身,从而无需辅助。VBScript脚本-未来版本可能支持该脚本(但不会将其反向移植到Windows PowerShell(。


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

如果给定的*.ps1没有BOM,Windows PowerShell会根据系统的活动ANSI代码页(单字节编码,如Windows-1252(,将UTF-8编码序列(所有非ASCII字符编码为2-4字节(中的每个字节分别解释为字符。

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

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


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

由于你的脚本显然是隐藏运行的,所以在你的情况下不会有什么不同,但请注意,这种技术表现出伪交互模式,也不支持将参数传递给通过stdin提供的脚本-请参阅GitHub问题#3223

最新更新