vbsによって呼び出されたPowershellのドイツ語ウムラウト
リンクを作成する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を呼び出して作業を行うと、一般的には機能しますが、「説明」のドイツ語のウムラウトは単なる質問マークであるため、どういうわけかエンコーディングがスクランブルされました。これを修正する方法はありますか?
回答
tl; dr:
BOMを
*.ps1
使用してファイルをUTF-8として保存します。PowerShell CLIの
-File
パラメーターを使用して、コマンドを簡略化します。
command = "powershell.exe -NoProfile -File ""C:\path\to\file\create-link.ps1"""
参照:GitHubの問題#3028。これは、PowerShell自体を完全に非表示にして起動する機能を要求します。これにより、Auxが不要になります。VBScriptスクリプト-将来のバージョンでサポートされる可能性があります(ただし、Windows PowerShellにはバックポートされません)。
Windows PowerShell(v5.1までのバージョン)を使用している場合*.ps1
、ASCII(7ビット)範囲外の文字に関してファイルを正しく解釈するには、ファイルをBOM付きのUTF-8として保存する必要があります。などäöüß
。
これは、PowerShell [Core] v6 +では不要になりました。これは常にデフォルトでUTF-8になっていますが、スクリプトを両方のエディションで実行する必要がある場合は、常にBOMでUTF-8を使用する必要があります。
特定の*.ps1
バイトにBOMがない場合、Windows PowerShellは、システムのアクティブなANSIに基づいて、UTF-8エンコードシーケンスの一部である各バイト(すべての非ASCII文字は2〜4バイトとしてエンコードされます)を個別に文字として解釈します。コードページ(Windows-1252などのシングルバイトエンコーディング)。
したがって、アクティブなANSIコードページがWindows-1252である米国英語システムでは、上記のサンプル文字列はガベージ文字列として表示されます。 äöüß
疑問符、より正確には�
(REPLACEMENT CHARACTER、U+FFFD)のインスタンスは、ANSIでエンコードされたテキストがUTF-8として誤って解釈された場合の逆のシナリオでのみ表示されることに注意してください。
余談ですが、パイプライン(stdin)を介してPowerShellCLIにソースコードを提供するというアプローチを再確認してください。
スクリプトは明らかに非表示で実行されるため、ケースに違いはありませんが、この手法は疑似インタラクティブモードを示し、stdinを介して提供されるスクリプトへの引数の受け渡しもサポートしていないことに注意してください-GitHubの問題#3223を参照してください