Как преобразовать сценарий PowerShell в Base64?

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

У меня есть следующий скрипт, который я пытаюсь преобразовать в Base64:

Function Get-Networks { 
    $Network = Get-WmiObject Win32_NetworkAdapterConfiguration | where { $_.MACAddress -notlike $null }  | select Index, Description, IPAddress, DefaultIPGateway, MACAddress | Format-Table Index, Description, IPAddress, DefaultIPGateway, MACAddress     
    $WLANProfileNames = @() 
    $Output = netsh.exe wlan show profiles | Select-String -pattern " : " 
    Foreach ($WLANProfileName in $Output) {     
        $WLANProfileNames += (($WLANProfileName -split ":")[1]).Trim() 
    } 
    $WLANProfileObjects = @() 
    Foreach ($WLANProfileName in $WLANProfileNames) {     
        try {         
            $WLANProfilePassword = (((netsh.exe wlan show profiles name="$WLANProfileName" key=clear | select-string -Pattern "Key Content") -split ":")[1]).Trim()     
        }
        Catch {         
            $WLANProfilePassword = "The password is not stored in this profile"     
        }     
        $WLANProfileObject = New-Object PSCustomobject      
        $WLANProfileObject | Add-Member -Type NoteProperty -Name "ProfileName" -Value $WLANProfileName     
        $WLANProfileObject | Add-Member -Type NoteProperty -Name "ProfilePassword" -Value $WLANProfilePassword     
        $WLANProfileObjects += $WLANProfileObject     
        Remove-Variable WLANProfileObject  
        return $WLANProfileObjects 
    } 
}  
$Networks = Get-Networks 
echo $Networks

изначально я использовал следующий фрагмент, чтобы сделать это. Это будет читать содержимое моего файла в переменную, а затем преобразовывать его. Я заметил, что когда я преобразовал его обратно, он вывел все в одну строку и испортил форматирование.

$Content = Get-Content -Path $FilePath    
$converted = [convert]::ToBase64String([System.Text.encoding]::Unicode.GetBytes($Content))

Затем я переключился на следующий фрагмент, чтобы преобразовать его с использованием пути к файлу вместо сохранения содержимого в переменной, и мне было приятно видеть, что когда я преобразовал его обратно, он сохранил свою целостность.

[convert]::ToBase64String((Get-Content -path $FilePath -Encoding byte))

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

畆据楴湯䜠瑥中瑥潷歲⁳ൻ␊敎睴牯‽敇⵴浗佩橢捥⁴楗㍮弲敎睴牯䅫慤瑰牥潃普杩牵瑡潩⁼桷牥⁥⁻弤䴮䍁摁牤獥⁳渭瑯楬敫␠畮汬素†⁼敳敬瑣䤠摮硥‬敄捳楲瑰潩Ɱ䤠䅐摤敲獳‬敄慦汵䥴䝐瑡睥祡‬䅍䅃摤敲獳簠䘠牯慭⵴慔汢⁥湉敤ⱸ䐠獥牣灩楴湯‬偉摁牤獥ⱳ䐠晥畡瑬 偉慇整慷ⱹ䴠䍁摁牤獥⁳ഉ␊䱗乁牐景汩乥浡獥㴠⡀ഩ␊畏灴瑵㴠渠瑥桳攮數眠慬桳睯瀠潲楦敬⁳⁼敓敬瑣匭牴湩⁧瀭瑡整湲∠㨠∠਍潆敲捡⡨圤䅌偎潲楦敬慎敭椠伤瑵異⥴ൻ : The term
'畆据楴湯䜠瑥中瑥潷歲⁳ൻ␊敎睴牯‽敇⵴浗佩橢捥⁴楗㍮弲敎睴牯䅫慤瑰牥潃普杩牵瑡潩⁼桷牥⁥⁻弤䴮䍁摁牤獥⁳渭瑯楬敫␠畮汬素†⁼敳敬瑣䤠摮硥‬敄捳楲瑰潩Ɱ䤠䅐摤敲獳‬敄慦汵䥴䝐瑡睥祡‬䅍䅃摤敲獳簠䘠牯慭⵴慔汢⁥湉敤ⱸ䐠獥牣灩楴湯‬偉摁牤獥ⱳ䐠晥畡瑬偉慇整慷ⱹ䴠䍁摁牤獥⁳ഉ␊䱗乁牐景汩乥浡獥㴠⡀ഩ␊畏灴瑵㴠渠瑥桳攮數眠慬桳睯瀠潲楦敬⁳⁼敓敬瑣匭牴湩⁧瀭瑡整湲∠㨠∠਍潆敲捡⡨圤䅌偎潲楦敬慎敭椠伤瑵異⥴ൻ' is not recognized
as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ 畆据楴湯䜠瑥中瑥潷歲⁳ൻ␊敎睴牯‽敇⵴浗佩橢捥⁴楗㍮弲敎睴牯䅫慤瑰牥潃普杩牵瑡潩⁼桷牥⁥⁻弤䴮䍁摁牤獥⁳渭瑯楬敫␠畮汬素†⁼敳敬瑣䤠摮 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (畆据楴湯䜠瑥中瑥潷歲⁳ൻ␊敎睴...圤䅌偎潲楦敬慎敭椠伤瑵異⥴ൻ:String) [], CommandNotFoundException

Как мне просто написать скрипт для преобразования этого файла в base64, чтобы я мог его правильно выполнить?

похоже на глюк кодировки. вы можете протестировать часть кода, сохраняемую в файл, и различные параметры кодирования.

Lee_Dailey 09.04.2022 22:47

Если вас беспокоит потеря форматирования, продолжайте использовать то, что в настоящее время работает (получите байты, а затем конвертируйте в b64), но добавьте переключатель -Raw к Get-Content

Santiago Squarzon 09.04.2022 22:59

да, я провел немного больше исследований и сумел найти решение. В итоге я использовал следующий $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.Ge‌​tBytes((Get-Content -Path $Path -Raw -Encoding UTF8)))

JakobyScream 09.04.2022 23:26
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
3
3
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

$encoded = [Convert]::ToBase64String(
  [System.Text.Encoding]::Unicode.GetBytes(
    (Get-Content -Path $Path -Raw -Encoding UTF8)
  )
)
Ответ принят как подходящий

Чтобы дополнить собственное эффективное решение некоторым исходная информация:

  • Кодирование Base64 — это кодирование произвольных данных байт на основе ASCII-нить., поэтому, если нить должен быть закодирован, необходимо определить его конкретная кодировка как массив байтов.

  • В вашей первоначальной попытке (как и в вашем эффективном решении) вы правильно получили строку в кодировке Base64 на основе байтов, составляющих кодировку UTF-16LE входной строки для кодирования ([System.Text.Encoding]::Unicode.GetBytes(...)), потому что это то, что CLI Windows PowerShell (powershell.exe) / PowerShell (Core) 7+ CLI (pwsh) требует в аргументе, переданном его параметру -EncodedCommand.

    • Примечание по терминологии: в .NET и PowerShell этот конкретный Юникод кодирование плохо назван для абстрактного Unicode стандартный ([System.Text.Encoding]::Unicode в .NET, -Encoding Unicode в различных командлетах обработки файлов PowerShell)
  • проблема с вашей первоначальной попыткой должен был использовать Get-Contentбез переключатель -Raw, как указал Сантьяго Скуарзон:

    • Без-Raw, Get-Content выдает строки целевого файла по одному, которые при (неявном) сборе приводят к массив строк — в отличие от одной многострочной строки, которую возвращает -Raw.

      • В любом случае Get-Content считывает содержимое файла в строку (строки) .NET, которые состоят из единиц кода UTF-16 (экземпляры [char]), и чтобы убедиться, что содержимое файла интерпретируется правильно, вам может потребоваться использовать параметр -Encoding .

      • [System.Text.Encoding]::Unicode.GetBytes() всегда работает со строками .NET в памяти.

    • Когда множество передается методу .NET, который ожидает аргумент Один[string], PowerShell — возможно, к сожалению — автоматически преобразует его в строку с помощью объединение пространств его элементов.

      • Следовательно, новые строки (разрывы строк) во входной строке — это потерял (заменены пробелами), что может привести к сломанный код, учитывая, что символы новой строки имеют синтаксическое значение в коде PowerShell.

Возможно, стоит отметить, что в документации указано использовать -Encoding byte специально для двоичных файлов (в версии документации v5.1)

Santiago Squarzon 10.04.2022 01:22

@ Сантьяго, предпосылка вопроса состоит в том, чтобы закодировать нить в Base64, и PowerShell требует, чтобы такая строка была закодирована в кодировке UTF-16LE для использования с ее параметром -EncodedCommand CLI. Если вы прочитаете входную строку как поток байтовиз файла (-Encoding Byte в WinPS, -AsByteStream в PS Core) и передадите собранный массив байтов напрямую в [System.Convert]::ToBase64String(), это будет работать только (a) если этот файл имеет кодировку UTF-16LE и ( б) если этот файл не имеет спецификации - что маловероятно в случае файла UTF-16.

mklement0 10.04.2022 03:22

Я очень ценю ваш полный разбор того, что здесь происходит. Хотя мне удалось провести некоторые исследования и выяснить это, понимание того, что непосредственно вызывало проблему, было мне неизвестно до сих пор. Заставить его работать, конечно, хорошо, но понять, почему он теперь работает, просто замечательно, и я снова очень благодарен.

JakobyScream 10.04.2022 04:04

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