Umlauts allemands dans Powershell appelés par vbs

Dec 15 2020

j'ai un fichier ps1, qui crée un lien

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

J'ai aussi un fichier vbs qui appelle la ps1

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

Les deux fichiers sont enregistrés avec le codage utf-8.

Cette construction était nécessaire, car la ps1 devait fonctionner complètement sans tête sans aucune chose notable pour l'utilisateur. Appeler une ps1 via un vbs a résolu ce problème, s'il y a une meilleure façon, je serais heureux si vous me le faites savoir.

Si j'appelle le script powershell directement ou avec "powershell.exe Get-Content" "C: \ chemin \ vers \ fichier \ create-link.ps1" "| PowerShell.exe -noprofile" (en utilisant cmd) tout fonctionne bien . Cependant, si j'appelle les vbs pour faire le travail, cela fonctionne en général, mais les trémas allemands de 'Description' ne sont que des points d'interrogation, donc l'encodage a été brouillé. Y a-t-il un moyen de réparer ceci?

Réponses

2 mklement0 Dec 15 2020 at 20:59

tl; dr:

  • Enregistrez votre *.ps1fichier au format UTF-8 avec BOM .

  • Simplifiez votre commande en utilisant le paramètre de l' interface de ligne de commande PowerShell -File:

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

Voir aussi: GitHub issue # 3028 , qui demande la possibilité de lancer PowerShell lui-même complètement caché - évitant ainsi d'avoir besoin d'un auxiliaire. Script VBScript - qu'une future version peut prendre en charge (mais il ne sera pas rétroporté sur Windows PowerShell).


Si vous utilisez Windows PowerShell (versions jusqu'à v5.1), vous devez enregistrer vos *.ps1fichiers au format UTF-8 avec une nomenclature afin qu'ils soient interprétés correctement par rapport aux caractères en dehors de la plage ASCII (7 bits), comme äöüß.
Cela n'est plus nécessaire dans PowerShell [Core] v6 + , qui utilise systématiquement par défaut UTF-8, mais si vos scripts doivent s'exécuter dans les deux éditions, vous devez toujours utiliser UTF-8 avec BOM .

Si une donnée *.ps1n'a pas de nomenclature, Windows PowerShell interprète chaque octet qui fait partie d'une séquence de codage UTF-8 (tous les caractères non-ASCII sont codés comme 2-4 octets) individuellement comme un caractère, en fonction de l'ANSI actif du système page de codes (un codage sur un octet tel que Windows-1252).

Sur un système anglais américain, où la page de codes ANSI active est Windows-1252, l'exemple de chaîne ci-dessus apparaît donc comme une chaîne de déchets äöüß

Notez que les points d'interrogation, ou, plus précisément, les instances de (REMPLACEMENT CHARACTER, U+FFFD), ne feraient surface que dans le scénario inverse : lorsque le texte codé ANSI est mal interprété comme UTF-8.


En passant, concernant votre approche consistant à fournir le code source à l'interface de ligne de commande PowerShell via le pipeline (stdin) :

Étant donné que votre script s'exécute apparemment caché, cela ne fera aucune différence dans votre cas, mais notez que cette technique présente un mode pseudo-interactif et ne prend pas en charge le passage d' arguments au script fourni via stdin - voir le problème GitHub # 3223