Umlauts alemão no Powershell chamado por vbs
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
tl; dr:
Salve seu
*.ps1
arquivo como UTF-8 com BOM .Simplifique o seu comando usando o PowerShell CLI 's
-File
parâ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 *.ps1
arquivos 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 *.ps1
nã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