Umlauts allemands dans Powershell appelés par vbs
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
tl; dr:
Enregistrez votre
*.ps1
fichier 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 *.ps1
fichiers 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 *.ps1
n'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