我正在编写一个PS脚本,该脚本需要从服务器下载解密密钥。但是,当我想将其作为字节流检索时,PS引擎会将文件解析为文本。例如,该文件包含84416e8e(ASCII:“AnŽ”),而下载的文件包含6539653832646439(ASCII:e9e82dd9)我尝试了Invoke-WebRequest
和System.Net.WebClient
都没有成功,即使iwr具有选项{{ 1}}
编辑:问题可能不在于PS,我注意到通过Firefox打开密钥的URL允许我正确下载文件,但是通过Chrome打开会产生修改后的版本。这里有我想念的东西吗?
答案 0 :(得分:0)
OutFile参数将响应主体写入文件(作为二进制文件):
Invoke-WebRequest -OutFile tmp.png -Uri "https://upload.wikimedia.org/wikipedia/en/thumb/1/1d/Information_icon4.svg/40px-Information_icon4.svg.png"
也许您在管道中将响应主体作为文本处理,但是您不能这样做(除非转换为Base64或类似的语言之后)。
答案 1 :(得分:0)
我不确定我是否正确理解了这个问题,但是您可以下载一个二进制文件并将字节保存在文件中。
对于演示,我使用了7zip.exe。
$Response = Invoke-WebRequest -Uri "https://www.7-zip.org/a/7z1900-x64.exe" -OutFile "D:\decryption.key"
或使用BitsTransfer
Import-Module BitsTransfer
Start-BitsTransfer -Source "https://www.7-zip.org/a/7z1900-x64.exe" -Destination "D:\decryption.key"
然后您可以使用以下命令将该文件读取为字节数组:
[byte[]]$bytes = [System.IO.File]::ReadAllBytes("D:\decryption.key")
或使用此辅助函数将字符串映射为1到1字节的字符串:
function Import-BinaryString {
# Imports the bytes of a file to a string that has a
# 1-to-1 mapping back to the file's original bytes.
# Useful for performing binary regular expressions.
Param (
[Parameter(Mandatory = $True, ValueFromPipeline = $True, Position = 0)]
[ValidateScript( { Test-Path $_ -PathType Leaf } )]
[String]$Path
)
$Stream = New-Object System.IO.FileStream -ArgumentList $Path, 'Open', 'Read'
# Note: Codepage 28591 returns a 1-to-1 char to byte mapping
$Encoding = [Text.Encoding]::GetEncoding(28591)
$StreamReader = New-Object System.IO.StreamReader -ArgumentList $Stream, $Encoding
$BinaryText = $StreamReader.ReadToEnd()
$StreamReader.Close()
$Stream.Close()
return $BinaryText
}
并用于:
$binaryString = Import-BinaryString -Path "D:\decryption.key"
希望有帮助