Deutsche Umlaute in Powershell von vbs genannt

Dec 15 2020

Ich habe eine PS1-Datei, die einen Link erstellen

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

Ich habe auch eine vbs-Datei, die ps1 aufruft

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

Beide Dateien werden mit utf-8-Codierung gespeichert.

Diese Konstruktion war notwendig, da die ps1 vollständig kopflos laufen musste, ohne dass der Benutzer dies bemerkte. Das Aufrufen eines ps1 über ein vbs löste dieses Problem. Wenn es einen besseren Weg gibt, würde ich mich freuen, wenn Sie mich wissen lassen.

Wenn ich das Powershell-Skript direkt oder mit "Powershell.exe Get-Content" "C: \ Pfad \ zu \ Datei \ Create-Link.ps1" "| PowerShell.exe -noprofile" (mit cmd) aufrufe, funktioniert alles einwandfrei . Wenn ich jedoch die vbs anrufe, um die Arbeit zu erledigen, funktioniert es im Allgemeinen, aber die deutschen Umlaute von 'Description' sind nur Fragezeichen, also wurde die Codierung irgendwie verschlüsselt. Gibt es eine Möglichkeit, dies zu beheben?

Antworten

2 mklement0 Dec 15 2020 at 20:59

tl; dr:

  • Speichern Sie Ihre *.ps1Datei als UTF-8 mit Stückliste .

  • Vereinfachen Sie Ihren Befehl der Powershell mithilfe von CLI ‚s -FileParameter:

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

Siehe auch: GitHub-Problem Nr. 3028 , in dem die Möglichkeit gefordert wird , PowerShell selbst vollständig versteckt zu starten, sodass kein Aux erforderlich ist. VBScript-Skript - das möglicherweise von einer zukünftigen Version unterstützt wird (jedoch nicht auf Windows PowerShell zurückportiert wird).


Wenn Sie Windows PowerShell (Versionen bis Version 5.1) verwenden, müssen Sie Ihre *.ps1Dateien als UTF-8 mit einer Stückliste speichern , damit sie in Bezug auf Zeichen außerhalb des ASCII-Bereichs (7-Bit) korrekt interpretiert werden. wie äöüß.
Dies ist in PowerShell [Core] v6 + , das standardmäßig UTF-8 verwendet, nicht mehr erforderlich. Wenn Ihre Skripts jedoch in beiden Editionen ausgeführt werden müssen, sollten Sie UTF-8 immer mit Stückliste verwenden .

Wenn eine bestimmte *.ps1Stückliste keine Stückliste enthält, interpretiert Windows PowerShell jedes Byte, das Teil einer UTF-8-Codierungssequenz ist (alle Nicht-ASCII-Zeichen werden als 2 bis 4 Byte codiert), einzeln als Zeichen, basierend auf der aktiven ANSI des Systems Codepage (eine Einzelbyte-Codierung wie Windows-1252).

Auf einem US-englischen System, auf dem die aktive ANSI-Codepage Windows-1252 ist, wird die obige Beispielzeichenfolge daher als Garbage-Zeichenfolge angezeigt äöüß

Beachten Sie, dass Fragezeichen oder genauer gesagt Instanzen von (REPLACEMENT CHARACTER, U+FFFD) nur im umgekehrten Szenario auftauchen würden : Wenn ANSI-codierter Text als UTF-8 falsch interpretiert wird.


Abgesehen davon können Sie den Quellcode der PowerShell-CLI über die Pipeline (stdin) bereitstellen :

Da Ihr Skript anscheinend versteckt ausgeführt wird, macht es in Ihrem Fall keinen Unterschied. Beachten Sie jedoch, dass diese Technik einen pseudo-interaktiven Modus aufweist und auch keine Übergabe von Argumenten an das über stdin bereitgestellte Skript unterstützt - siehe GitHub-Problem Nr. 3223