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

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

создать-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.

создать-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 для выполнения работы, она в целом работает, но немецкие умляуты из «Описания» — это просто вопросительные знаки, так что каким-то образом кодировка была зашифрована. Есть ли способ исправить это?

Get-Content также имеет параметр -Encoding.
iRon 15.12.2020 13:54

Почему вы вообще вызываете Powershell вместо создания ссылки из VBS?

zett42 15.12.2020 15:01

@ zett42 Я предполагаю, что единственная причина, по которой VBS вообще присутствует на картинке, заключается в том, чтобы компенсировать неспособность PowerShell запустить себя скрыто — см. GitHub issue #3028.

mklement0 15.12.2020 15:08

я все еще работаю над этим, но пока не добился успеха ... но пока спасибо, я приму это, как только смогу заставить его работать

bob 17.12.2020 09:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
788
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

тл; др:

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

  • Упростите свою команду, используя параметр -File PowerShell CLI:

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

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


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

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

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

Обратите внимание, что вопросительные знаки или, точнее, экземпляры (СИМВОЛ ЗАМЕНЫ, U+FFFD) будут появляться только в обратном сценарии: когда текст в кодировке ANSI неверно интерпретируется как UTF-8.


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

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

в качестве альтернативы, в качестве быстрого и грязного обходного пути, вы можете заменить умлаут на юникод, поэтому «Brücke» станет «Br» + « + [char] 0x00FC + «ke» '

bob 17.12.2020 11:42

@bob Никогда бы не порекомендовал это, даже как быстрый и грязный взлом. Видно, что слишком много людей неправильно относятся к кодированию, и подобные хаки ничем не лучше.

user692942 17.12.2020 11:54

@Lankymark, я полностью согласен, но мне нужно было очень быстрое решение «это должно работать СЕЙЧАС», работая над лучшим и переключая их позже.

bob 22.12.2020 12:03

Другие вопросы по теме