如何将 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 代码中确实具有语法意义。
我一直在为这件事绞尽脑汁,想不通我是如何失去诚信的...
我正在尝试将以下脚本转换为 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 中)
- 术语说明:在 .NET 和 PowerShell 中,此 specific Unicode encoding 的命名不符合抽象 Unicode 标准(
您最初尝试的问题是使用
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 代码中确实具有语法意义。