Немецкие умляуты в Powershell, вызываемые vbs

Dec 15 2020

у меня есть файл ps1, который создает ссылку

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

У меня также есть файл vbs, который вызывает 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

Оба файла сохранены в кодировке utf-8.

Эта конструкция была необходима, потому что ps1 должен был работать полностью без головы, без каких-либо заметных для пользователя вещей. Вызов ps1 через vbs решил эту проблему, если есть лучший способ, я буду рад, если вы дадите мне знать.

Если я вызываю сценарий PowerShell напрямую или с помощью «powershell.exe Get-Content» «C: \ path \ to \ file \ create-link.ps1» «| PowerShell.exe -noprofile» (с помощью cmd), все работает нормально . Однако, если я вызываю vbs для выполнения работы, он работает в целом, но немецкие умляуты из «Описание» - это просто вопросительные знаки, поэтому каким-то образом кодировка была зашифрована. Есть ли способ исправить это?

Ответы

2 mklement0 Dec 15 2020 at 20:59

tl; dr:

  • Сохраните *.ps1файл как UTF-8 с BOM .

  • Упростите вашу команду с помощью PowerShell в CLI «сек -Fileпараметра:

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

См. Также: выпуск GitHub № 3028 , в котором запрашивается возможность полностью скрытого запуска PowerShell , что устраняет необходимость в дополнительном. Сценарий VBScript, который может поддерживаться в будущей версии (но он не будет перенесен в Windows PowerShell).


Если вы используете Windows PowerShell (версии до v5.1), вы должны сохранить свои *.ps1файлы как UTF-8 со спецификацией, чтобы они правильно интерпретировались относительно символов вне диапазона ASCII (7-бит), такие как äöüß.
Это больше не требуется в PowerShell [Core] v6 + , который по умолчанию использует UTF-8, но если ваши сценарии необходимо запускать в обоих выпусках, вы всегда должны использовать UTF-8 с BOM .

Если у заданного *.ps1нет спецификации, Windows PowerShell интерпретирует каждый байт, который является частью последовательности кодирования UTF-8 (все символы, отличные от ASCII, кодируются как 2-4 байта), индивидуально как символ на основе активного ANSI системы. кодовая страница (однобайтовая кодировка, например Windows-1252).

В системе на английском языке (США), где активной кодовой страницей ANSI является Windows-1252, приведенная выше примерная строка отображается как строка мусора. äöüß

Обратите внимание, что вопросительные знаки или, точнее, экземпляры (REPLACEMENT CHARACTER, U+FFFD) будут появляться только в обратном сценарии: когда текст в кодировке ANSI неверно интерпретируется как UTF-8.


Кроме того, рассмотрим ваш подход к предоставлению исходного кода для интерфейса командной строки PowerShell через конвейер (stdin) :

Поскольку ваш скрипт, по-видимому, работает скрыто, в вашем случае это не повлияет, но обратите внимание, что этот метод демонстрирует псевдо-интерактивный режим, а также не поддерживает передачу аргументов в скрипт, предоставляемый через стандартный ввод - см. Проблему GitHub # 3223