如何将文件下载为字节流?

时间:2019-07-02 21:04:02

标签: powershell download

我正在编写一个PS脚本,该脚本需要从服务器下载解密密钥。但是,当我想将其作为字节流检索时,PS引擎会将文件解析为文本。例如,该文件包含84416e8e(ASCII:“AnŽ”),而下载的文件包含6539653832646439(ASCII:e9e82dd9)我尝试了Invoke-WebRequestSystem.Net.WebClient都没有成功,即使iwr具有选项{{ 1}}

编辑:问题可能不在于PS,我注意到通过Firefox打开密钥的URL允许我正确下载文件,但是通过Chrome打开会产生修改后的版本。这里有我想念的东西吗?

2 个答案:

答案 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"

希望有帮助