Umlauts alemão no Powershell chamado por vbs

Dec 15 2020

eu tenho um arquivo ps1, que cria um link

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

Eu também tenho um arquivo vbs que chama o 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 os arquivos são salvos com codificação utf-8.

Essa construção foi necessária, porque o ps1 precisava rodar completamente sem cabeça, sem qualquer coisa perceptível para o usuário. Chamar um ps1 através de um vbs resolveu esse problema, se houver uma maneira melhor ficaria feliz se me avisassem.

Se estou chamando o script do powershell diretamente ou com "powershell.exe Get-Content" "C: \ path \ to \ file \ create-link.ps1" "| PowerShell.exe -noprofile" (usando cmd) tudo funciona bem . No entanto, se eu chamar o vbs para fazer o trabalho, ele funciona em geral, mas os tremas alemães de 'Descrição' são apenas pontos de interrogação, então de alguma forma a codificação foi embaralhada. Existe alguma maneira de corrigir isso?

Respostas

2 mklement0 Dec 15 2020 at 20:59

tl; dr:

  • Salve seu *.ps1arquivo como UTF-8 com BOM .

  • Simplifique o seu comando usando o PowerShell CLI 's -Fileparâmetro:

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

Veja também: GitHub questão # 3028 , que solicita a capacidade de lançar PowerShell si completamente escondido - eliminando a necessidade de um aux. Script VBScript - que uma versão futura pode oferecer suporte (mas não será portado para o Windows PowerShell).


Se estiver usando o Windows PowerShell (versões até v5.1), você deve salvar seus *.ps1arquivos como UTF-8 com um BOM para que sejam interpretados corretamente em relação aos caracteres fora do intervalo ASCII (7 bits), como äöüß.
Isso não é mais necessário no PowerShell [Core] v6 + , que é padronizado de forma consistente para UTF-8, mas se seus scripts precisarem ser executados em ambas as edições, você sempre deve usar UTF-8 com BOM .

Se um determinado *.ps1não tiver um BOM, o Windows PowerShell interpretará cada byte que faz parte de uma sequência de codificação UTF-8 (todos os caracteres não ASCII são codificados como 2-4 bytes) individualmente como um caractere, com base no ANSI ativo do sistema página de código (uma codificação de byte único, como Windows-1252).

Em um sistema inglês dos Estados Unidos, onde a página de código ANSI ativa é Windows-1252, a string de amostra acima aparece como uma string de lixo äöüß

Observe que os pontos de interrogação, ou, mais precisamente, as instâncias de (REPLACEMENT CHARACTER, U+FFFD), só apareceriam no cenário inverso : quando o texto codificado em ANSI fosse mal interpretado como UTF-8.


Como um aparte, é sua abordagem de fornecer o código-fonte para a CLI do PowerShell por meio do pipeline (stdin) :

Como o seu script aparentemente é executado oculto, não fará diferença no seu caso, mas observe que essa técnica exibe o modo pseudo-interativo e também não oferece suporte à passagem de argumentos para o script fornecido via stdin - consulte o problema # 3223 do GitHub