Umlauts alemanes en Powershell llamado por vbs

Dec 15 2020

tengo un archivo ps1, que crea un enlace

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

También tengo un archivo vbs que llama al 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

Ambos archivos se guardan con codificación utf-8.

Esta construcción era necesaria, porque la ps1 necesitaba funcionar completamente sin cabeza y sin cosas notables para el usuario. Llamar a una ps1 a través de un vbs resolvió este problema, si hay una mejor manera, sería feliz si me lo hiciera saber.

Si estoy llamando al script de powershell directamente o con "powershell.exe Get-Content" "C: \ path \ to \ file \ create-link.ps1" "| PowerShell.exe -noprofile" (usando cmd) todo funciona bien . Sin embargo, si llamo a la vbs para que haga el trabajo, funciona en general, pero las diéresis en alemán de 'Descripción' son solo signos de interrogación, por lo que de alguna manera la codificación se mezcló. ¿Hay alguna forma de arreglar esto?

Respuestas

2 mklement0 Dec 15 2020 at 20:59

tl; dr:

  • Guarde su *.ps1archivo como UTF-8 con BOM .

  • Simplificar su comando mediante el PowerShell CLI 's -Filede parámetros:

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

Ver también: GitHub edición # 3028 , que solicita la capacidad de lanzar PowerShell en sí completamente oculto - obviando la necesidad de un auxiliar. Secuencia de comandos de VBScript, que puede admitir una versión futura (pero no se transferirá a Windows PowerShell).


Si está utilizando Windows PowerShell (versiones hasta v5.1), debe guardar sus *.ps1archivos como UTF-8 con una lista de materiales para que se interpreten correctamente con respecto a los caracteres fuera del rango ASCII (7 bits), como äöüß.
Esto ya no es necesario en PowerShell [Core] v6 + , que de forma predeterminada es UTF-8, pero si sus scripts deben ejecutarse en ambas ediciones, siempre debe usar UTF-8 con BOM .

Si un determinado *.ps1no tiene una lista de materiales, Windows PowerShell interpreta cada byte que forma parte de una secuencia de codificación UTF-8 (todos los caracteres que no son ASCII se codifican como 2-4 bytes) individualmente como un carácter, según el ANSI activo del sistema. página de códigos (una codificación de un solo byte como Windows-1252).

En un sistema en inglés de EE. UU., Donde la página de códigos ANSI activa es Windows-1252, la cadena de muestra anterior aparece como cadena de basura äöüß

Tenga en cuenta que los signos de interrogación o, más exactamente, las instancias de (CARÁCTER DE REEMPLAZO U+FFFD), solo aparecerían en el escenario inverso : cuando el texto codificado en ANSI se malinterpreta como UTF-8.


Como comentario al margen, cuál es su enfoque de proporcionar el código fuente a la CLI de PowerShell a través de la canalización (stdin) :

Dado que su script aparentemente se ejecuta oculto, no hará una diferencia en su caso, pero tenga en cuenta que esta técnica exhibe un modo pseudo-interactivo y tampoco admite el paso de argumentos al script que se proporciona a través de stdin; consulte el número de GitHub n. ° 3223