如何将 PowerShell 脚本转换为 Base64?

How do I convert a PowerShell script to 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,以便我可以正确执行它?

我最终做了更多的研究并找到了一种方法,它完全符合我的需要并保持了它的完整性。

$encoded = [Convert]::ToBase64String(
  [System.Text.Encoding]::Unicode.GetBytes(
    (Get-Content -Path $Path -Raw -Encoding UTF8)
  )
)

用一些背景信息补充:

  • Base64 编码是一种基于 ASCII-string 的任意 byte 数据的编码,因此如果要对 字符串 进行编码,则其 特定编码 作为 字节数组 需要决定。

  • 在您最初的尝试中(如在您的有效解决方案中),您根据构成 UTF- 的字节正确地获得了 Base64 编码的字符串16LE 对输入字符串进行编码 ([System.Text.Encoding]::Unicode.GetBytes(...)),因为这是 Windows PowerShell CLI (powershell.exe) / PowerShell (Core) 7+ CLI (pwsh) 在传递的参数中所需要的到它的 -EncodedCommand 参数。

    • 术语说明:在 .NET 和 PowerShell 中,此 specific Unicode encoding 的命名不符合抽象 Unicode 标准[System.Text.Encoding]::Unicode 在 .NET 中,-Encoding Unicode 在 PowerShell 的各种 file-processing cmdlet 中)
  • 您最初尝试的问题是使用Get-Content without the -Raw switch, as Santiago Squarzon指出:

    • Without -Raw, Get-Content 逐条发出目标文件的行 ,当(隐含地)收集时,会产生一个 行数组 - 与单个 multi-line 字符串相反 -Raw returns.

      • 无论哪种方式,Get-Content 都会将文件内容读入由 UTF-16 代码单元([char] 实例)组成的 .NET 字符串,然后确保正确解释文件内容,您可能需要使用 -Encoding 参数。

      • [System.Text.Encoding]::Unicode.GetBytes() 总是对 in-memory .NET 字符串进行操作。

    • array 传递给需要 single [string] 参数的 .NET 方法时,PowerShell - 也许不幸的是 - 通过 space-concatenating 其元素自动将其字符串化。

      • 因此,输入字符串中的换行符(换行符)丢失(替换为空格),这会导致断码,鉴于换行符在 PowerShell 代码中确实具有语法意义。