у меня есть файл 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 для выполнения работы, она в целом работает, но немецкие умляуты из «Описания» — это просто вопросительные знаки, так что каким-то образом кодировка была зашифрована. Есть ли способ исправить это?
Почему вы вообще вызываете Powershell вместо создания ссылки из VBS?
@ zett42 Я предполагаю, что единственная причина, по которой VBS вообще присутствует на картинке, заключается в том, чтобы компенсировать неспособность PowerShell запустить себя скрыто — см. GitHub issue #3028.
я все еще работаю над этим, но пока не добился успеха ... но пока спасибо, я приму это, как только смогу заставить его работать
Отвечает ли это на ваш вопрос? Как я могу использовать символы с диакритическими знаками в команде echo в пакетной программе?
тл; др:
Сохраните файл *.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 Никогда бы не порекомендовал это, даже как быстрый и грязный взлом. Видно, что слишком много людей неправильно относятся к кодированию, и подобные хаки ничем не лучше.
@Lankymark, я полностью согласен, но мне нужно было очень быстрое решение «это должно работать СЕЙЧАС», работая над лучшим и переключая их позже.
-Encoding
.