我确实有一个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