在PowerShell 5.1中进行Base64编码和解码

5
我找到了几个资源(包括将base64字符串转换为文件,它在这里实际上是一个重复的资源,因为它是我用来构建这个项目的资源之一),但我似乎无法使其正常工作。
我有以下代码(大致 - 显然它已经被精简了),并且我可以根据注释验证过程的大部分步骤。
$pic = Get-Content 'testpic.png'
# $pic looks like a binary dump.

$picBytes = [System.Text.Encoding]::Unicode.GetBytes($pic)
$ $picBytes is an array of bytes. Quite spammy.

$picEncoded = [Convert]::ToBase64String($picBytes)
# $picEncoded is indeed a Base64 string. Halfway there!

$picDecoded = [Convert]::FromBase64String($picEncoded)
# Also an array of bytes. I'm assuming they're right for now...

$outFile = "pic.png"
[IO.File]::WriteAllBytes($outFile,$picDecoded)
# but I get no output file and no error?

我这里缺少了什么?就我所知,我愿意看看其他的解决方案——但是Base64有些重要(因为我将数据存储在脚本中。)


$outFile 的值是多少? - G42
$outFile = "pic.png" - Epsilon
2
检查c:\windows\system32中是否存在pic.png。使用完整路径! - G42
系统32里面什么都没有,但是...为什么。就是为什么。是的,提供完整路径似乎可以解决问题(尽管我的转换出了问题,但那是另一个问题)。 - Epsilon
忘了感谢 @G42 - 很抱歉,我一直在为这个问题苦苦挣扎了3个小时,最终发现解决方案是一个与我的脚本中其他任何东西都不同的模式。 - Epsilon
您可能会在 C:... 的直接位置找到它,我不记得 .net 方法默认在哪里。无论如何很高兴听到问题解决了。 - G42
1个回答

3

要在PowerShell中将二进制文件原样读入内存,请使用Get-Content-AsByteStream开关(PowerShell(Core)7+)/ -Encoding Byte(Windows PowerShell,版本高达v5.1),并且在一次性读取所有字节时添加-Raw开关以提高效率

# Windows PowerShell (up to v5.1).
# Note: In PowerShell (Core) v7+, you must use -AsByteStream instead of
#       -Encoding Byte
$picBytes = Get-Content testpic.png -Encoding Byte -Raw

注意:这种语法在PowerShell版本之间的更改是不幸的,如GitHub问题#7986所讨论的那样。如果有足够的人表示兴趣,可以“想象”将重新引入-Encoding Byte以实现跨版一致性和兼容性。
作为[byte[]]数组的$picBytes,可以直接传递给[Convert] :: ToBase64String()
要将文件名/路径传递到.NET方法,请始终传递完整路径,而不是相对路径或仅文件名:
这是必要的,因为 .NET的工作目录通常与PowerShell的不同。
这种差异是不幸的,但无法避免,正如此回答所解释的那样。
最简单的情况下 - 如果您当前的位置是一个基于文件系统的位置,但不是基于PowerShell特定驱动器的位置:
$outFile = "$PWD/pic.png" # Use *full path*
[IO.File]::WriteAllBytes($outFile, $picDecoded)

完全稳健的方法需要更多的工作:

$outFile = Join-Path (Get-Location -PSProvider FileSystem).ProviderPath pic.png
[IO.File]::WriteAllBytes($outFile, $picDecoded)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接