powershell - base64编码的PowerShell问题
问题描述
我需要将一个逗号分隔值数组(一个 .csv)转换成一些 JSON,如下所示:
"traits": {
"file": {
"content": "R0lGODlhABAQAIAAAAAAAP///yH7BAEAAAAALAAAAAAEAABAAAIBRAA5",
"file_name": "test.png"
}
}
我正在使用以下内容:
$traits = New-Object PSObject
$file = New-Object PSObject
$file | Add-Member -Type NoteProperty -Name file_name -Value "file.csv"
$file | Add-Member -Type NoteProperty -Name content -Value $([Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes(($domain.GPOs | ConvertTo-Csv))))
$traits | Add-Member -Type NoteProperty -Name group-policies -Value $file
似乎“内容”的内容编码不正确。为了排除故障,我将内容复制到 www.freeformatter.com/base64-encoder.html 并发现它们不匹配。
我错过了什么?
编辑:这是 .csv 的内容。这是我粘贴到https://www.freeformatter.com/base64-encoder.html#ad-output的内容:
#TYPE Selected.System.Xml.XmlElement
"Name","GUID","Linked To","Computer Settings","User Settings"
"Autodiscover - Shared Namespace","249b1923-523a-40b6-9180-cc2727414b9b","@{OU Name=servers; OU Path=domain.local/location/servers; Enabled=true; Enforced=false}","@{Enabled=true; Settings=}","@{Enabled=true; Settings=}"
Powershell 输出:
IwBUAFkAUABFACAAUwBlAGwAZQBjAHQAZQBkAC4AUwB5AHMAdABlAG0ALgBYAG0AbAAuAFgAbQBsAEUAbABlAG0AZQBuAHQAIAAiAE4AYQBtAGUAIgAsACIARwBVAEkARAAiACwAIgBMAGkAbgBrAGUAZAAgAFQAbwAiACwAIgBDAG8AbQBwAHUAdABlAHIAIABTAGUAdAB0AGkAbgBnAHMAIgAsACIAVQBzAGUAcgAgAFMAZQB0AHQAaQBuAGcAcwAiACAAIgBBAHUAdABvAGQAaQBzAGMAbwB2AGUAcgAgAC0AIABTAGgAYQByAGUAZAAgAE4AYQBtAGUAcwBwAGEAYwBlACIALAAiADIANAA5AGIAMQA5ADIAMwAtADUAMgAzAGEALQA0ADAAYgA2AC0AOQAxADgAMAAtAGMAYwAyADcAMgA3ADQAMQA0AGIAOQBiACIALAAiAEAAewBPAFUAIABOAGEAbQBlAD0AcwBlAHIAdgBlAHIAcwA7ACAATwBVACAAUABhAHQAaAA9AGQAbwBtAGEAaQBuAC4AbABvAGMAYQBsAC8AbABvAGMAYQB0AGkAbwBuAC8AcwBlAHIAdgBlAHIAcwA7ACAARQBuAGEAYgBsAGUAZAA9AHQAcgB1AGUAOwAgAEUAbgBmAG8AcgBjAGUAZAA9AGYAYQBsAHMAZQB9ACIALAAiAEAAewBFAG4AYQBiAGwAZQBkAD0AdAByAHUAZQA7ACAAUwBlAHQAdABpAG4AZwBzAD0AfQAiACwAIgBAAHsARQBuAGEAYgBsAGUAZAA9AHQAcgB1AGUAOwAgAFMAZQB0AHQAaQBuAGcAcwA9AH0AIgA=
该网站吐槽:
I1RZUEUgU2VsZWN0ZWQuU3lzdGVtLlhtbC5YbWxFbGVtZW50DQoiTmFtZSIsIkdVSUQiLCJMaW5rZWQgVG8iLCJDb21wdXRlciBTZXR0aW5ncyIsIlVzZXIgU2V0dGluZ3MiDQoiQXV0b2Rpc2NvdmVyIC0gU2hhcmVkIE5hbWVzcGFjZSIsIjI0OWIxOTIzLTUyM2EtNDBiNi05MTgwLWNjMjcyNzQxNGI5YiIsIkB7T1UgTmFtZT1zZXJ2ZXJzOyBPVSBQYXRoPWRvbWFpbi5sb2NhbC9sb2NhdGlvbi9zZXJ2ZXJzOyBFbmFibGVkPXRydWU7IEVuZm9yY2VkPWZhbHNlfSIsIkB7RW5hYmxlZD10cnVlOyBTZXR0aW5ncz19IiwiQHtFbmFibGVkPXRydWU7IFNldHRpbmdzPX0i
解决方案
存在三个(潜在)问题:
字符编码:
- www.freeformatter.com将 Base64 编码基于输入字符串的UTF-8编码。
- 您的 PowerShell 代码使用 UTF-16LE ("
Unicode
") 编码作为基础;[System.Text.Encoding]::UTF8.GetBytes()
如果您想要 UTF-8,请改用。
换行符样式(行尾)
- 在www.freeformatter.com上粘贴的文本中的换行符会悄悄地转换为 Windows 样式的 CRLF 换行符,而您的输入可能只有 Unix 样式的 LF 换行符。
换行符迷路了:
- 您正在将输出从
ConvertTo-Csv
(一个字符串数组)传递到[System.Text.Encoding]::Unicode.GetBytes()
,它需要一个字符串。在这个过程中,PowerShell对数组进行了字符串化,这意味着它的元素以空格作为分隔符连接起来,因此原来的换行符被替换为空格,从而导致不同的编码输出。 - 因此,
($domain.GPOs | ConvertTo-Csv)
使用($domain.GPOs | ConvertTo-Csv) -join [Environment]::NewLine
(它使用适合平台的换行符序列;或者,使用"`n"
或"`r`n"
显式;另外,您可能希望附加尾随换行符)。
- 您正在将输出从
推荐阅读
- python - 从源代码还是通过 Pip 安装 OpenCV?
- java - 如何在 java 流中仅查找和匹配一个元素列表?
- angular - RxJS operator with array
- visual-studio-code - VSCode链接票证/自定义规则?
- java - ViewPager2#onpageselect StackOverflowError
- asp.net-core-webapi - 使用WebApi接口用pkce流实现IdentityServer是真的吗
- elasticsearch - 有没有办法在 Kibana 中更改文档的默认视图?
- spring-boot - 无法在关闭的连接上调用方法,在连接 tera 数据池的理想时间后面临此问题
- php - PHP shell_exec 一段时间后返回空字符串
- python - 从存储桶(Google Cloud Storage)获取文件类型 json 以上传并保存在 VM 实例中