You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell复制字符串传入的Zip文件到远程服务器报错解决

问题根因

Zip文件解压提示无效是两层逻辑错误共同导致的文件损坏:

  • .NET端二进制处理逻辑错误:Zip是二进制格式文件,使用StreamReader(文本读取器)逐行读取、调用AppendLine()拼接的操作,会按照系统默认文本编码强行解析二进制字节,还会在每行末尾额外追加换行符,从源头破坏原始文件的字节结构。
  • PowerShell端写入逻辑错误:New-Item -Value接收字符串参数时,默认以文本编码写入文件,不会还原原始二进制字节,二次损坏文件内容。
正确实现方案

核心思路是放弃用普通字符串直接承载二进制内容,改用Base64做二进制安全的中转编码,写入时直接操作字节数组,全程不碰文本编码逻辑。

.NET端修改

替换原有错误的文件流转字符串方法,直接读取文件字节数组转Base64字符串,适配异步场景的实现代码如下:

public async Task<IActionResult> Index(IFormFile file)
{
    // 将上传的Zip文件转为Base64字符串
    string fileBase64 = await ConvertFileToBase64String(file);
    // 执行PowerShell脚本
    PowerShellHelper(fileBase64,... other paramter);

    //Other Code...
}

private async Task<string> ConvertFileToBase64String(IFormFile file)
{
    using (var ms = new MemoryStream())
    {
        await file.CopyToAsync(ms);
        return Convert.ToBase64String(ms.ToArray());
    }
}

PowerShell端修改

替换原有New-Item文本写入逻辑,将传入的Base64字符串解码为原始字节数组,以二进制方式写入目标路径,代码如下:

function zipcopyfunction
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true, 
                Position=0,
                HelpMessage='Please Provide Zip File')]
        [ValidateNotNullOrEmpty()]
        [string]$zipFileBase64,
        #other necessary paramters goes here...
    )

    #Other code related to session creation
    try
    { 
        $DestinationFilePath = "C:\test\destFile.zip"
        Invoke-Command -Session $Session -ScriptBlock { 
            Param($zipFileBase64, $DestinationFilePath) 
            # Base64解码为原始字节数组
            $zipBytes = [Convert]::FromBase64String($zipFileBase64)
            # 二进制方式写入文件
            [System.IO.File]::WriteAllBytes($DestinationFilePath, $zipBytes)

            # 可选:写入后立即校验Zip完整性
            Add-Type -AssemblyName System.IO.Compression.FileSystem
            try {
                $zipStream = [System.IO.Compression.ZipFile]::OpenRead($DestinationFilePath)
                $zipStream.Dispose()
            } catch {
                throw "写入的Zip文件已损坏:$($_.Exception.Message)"
            }
        }  -ArgumentList ($zipFileBase64, $DestinationFilePath)
        #remove session related code...
    }
    catch
    {
        Throw $_.exception.message
    }
}
场景最佳实践
  • 禁止用文本组件处理二进制文件:所有压缩包、图片、音视频、可执行程序等非文本格式,不得使用StreamReader/StreamWriter、字符串拼接这类文本逻辑处理,必须直接操作原始字节数组,或使用BinaryReader/BinaryWriter等专用二进制IO类。
  • 字符串通道传输二进制必须使用无损编码:如果传输通道仅支持字符串类型参数(比如跨进程调用、脚本传参),必须使用Base64这类二进制安全的编码做中转,禁止直接将二进制字节按文本编码强行转字符串。
  • 增加传输完整性校验:源端计算文件SHA256哈希值、文件长度,和文件内容一起传到远端,写入完成后重新计算目标文件的哈希、长度和源值比对,完全一致再执行后续解压操作,提前发现传输损坏问题。
  • 大文件场景避免全量Base64传输:Base64编码会比原始文件大33%左右,单文件超过100MB时不建议用这种方式,优先选择两种方案:一是用Copy-Item -ToSession $Session直接通过PowerShell会话传输二进制文件,不需要手动转码;二是将文件上传到双方可访问的共享存储,远端直接拉取,传输效率更高。
  • 分阶段做异常捕获:将文件解码、写入、校验、解压拆成独立步骤加异常捕获,可直接定位是传输损坏、写入权限不足、磁盘空间不足还是压缩包本身损坏的问题,降低排查成本。

内容的提问来源于stack exchange,提问作者Harish Shisode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:39:19