Задать вопрос
@Drovosek01

Почему Powershell автоматически меняет кодировку кода в UTF-16 LE?

Данная тема - следствие вот это - Какой минимальный код для скачивания и выполнения Powershell-скрипта с передачей в него аргументов?

Есть скрипт для поиска и замены hex-паттернов байт
https://github.com/Drovosek01/ReplaceHexPatcher/bl...

Я хочу сформировать однострочную команду для скачивания и выполнения этого скрипта, но командлет iex "ргуается" на комментарии в коде... и моментально закрывает окно Powershell
irm https://github.com/Drovosek01/ReplaceHexPatcher/raw/refs/heads/main/core/v2/ReplaceHexBytesAll.ps1 | iex

Хотя оригинальный файл в котором я пишу код - запускается без проблем.

Я переделал код на такой
& ([scriptblock]::Create((Invoke-RestMethod -Uri "https://github.com/Drovosek01/ReplaceHexPatcher/raw/refs/heads/main/core/v2/ReplaceHexBytesAll.ps1")))

Но он также выполнялся с ошибкой

Переделал код на такой, с скачиванием и сохранением его в файл и запуском файла
$url="https://github.com/Drovosek01/ReplaceHexPatcher/raw/refs/heads/main/core/v2/ReplaceHexBytesAll.ps1"; $f=[System.IO.Path]::GetTempFileName()+".ps1"; (irm $url)>$f; & $f

Но это все равно привело к ошибке

В итоге я перешел в папку %temp% и посмотрел созданный временный файл и он весил в 2 раза больше оригинального.
Оказалось, что скачанный код почему-то сохранился в файл с кодировкой UTF-16 LE

Почему так происходит?
  • Вопрос задан
  • 106 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@NortheR73
системный инженер
(irm $url)>$f
нафига здесь перенаправление (redirection), если и irm (Invoke-RestMethod), и iwr (Invoke-WebRequest) умеют выводить в файл через -OutFile? В предыдущем вопросе про это писал...
Если всё-таки хотите перенаправление (redirection) - используйте, например, Out-File, и у него можно задать кодировку через параметр Encoding: irm bla-bla-bla | Out-File -Encoding UTF8...
Оказалось, что скачанный код почему-то сохранился в файл с кодировкой UTF-16 LE
не знаю что и как у вас в системе настроено, но документация говорит следующее:
When you are writing to files, the redirection operators use UTF8NoBOM encoding. If the file has a different encoding, the output might not be formatted correctly. To write to files with a different encoding, use the Out-File cmdlet with its Encoding parameter.

P.S. ошибки прикладывайте - ибо не понятно в чем проблема...может банально прав не хватает.
Читайте документацию по используемым инструментам, профильные форумы и т.д. - ибо тот же гитхаб выдал, как минимум, десяток ссылок на однострочники, которые решают вашу задачу
Ответ написан
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
Ваш исходник: ReplaceHexBytesAll.ps1 содержит BOM, что мешает PowerShell выполнить скрипт.

iex "ргуается" на комментарии в коде...

Это на самом деле про BOM, а не комментарий.
1. Вам следует удалить BOM: в Notepad++ пересохранить без BOM или в IDE:
6824822b73416273864509.png
2. Если хочется однострочник с передачей аргументов, как у вас в начале было:
iex "& { $(irm 'https://raw.githubusercontent.com/Drovosek01/ReplaceHexPatcher/refs/heads/main/core/v2/ReplaceHexBytesAll.ps1') } -filePath 'C:\Users\dim5x\lol\lol.exe' -patterns '4883EC28BA2F????00??8D0DB0B7380A/11111111111111111111111111111111','C4 25 2A 0A 48 89 45 18 48 8D 55 18 48 8D 4D ?? / 1111 111111 111111 1111111111111111' -makeBackup -showMoreInfo -skipStopwatch -showFoundOffsetsInDecimal"

682484db5fc42085278250.png

З.Ы. Насколько целесообразно не сохранять скрипт, а выполнять его в памяти, если подразумевается его более чем однократное использование, — вопрос открытый.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы