如何在PowerShell中使用tar和tee实现一次读取多次写入的原始文件复制
PowerShell原生实现二进制流单次读取多次写入方案
方案1:.NET Stream 直接处理(兼容所有Win10自带PowerShell 5.1版本,二进制完全安全)
该方案完全绕开PowerShell默认管道的文本编码逻辑,不会篡改原始二进制数据,性能接近系统底层IO速度,适配大体积视频文件的无人值守拷贝场景:
# 配置参数 $sourcePath = "相机挂载路径\源视频文件路径" # 按实际存储卡挂载路径填写目标路径,支持任意数量 $targetPaths = @( "E:\存储卡1\目标文件名.mp4", "F:\存储卡2\目标文件名.mp4", "G:\存储卡3\目标文件名.mp4" ) $bufferSize = 4MB # 大文件场景可调整为8-16MB提升读写效率 # 打开源文件只读流 $sourceStream = [System.IO.File]::OpenRead($sourcePath) # 批量初始化所有目标写入流 $targetStreams = $targetPaths | ForEach-Object { [System.IO.File]::OpenWrite($_) } try { $buffer = New-Object byte[] $bufferSize $bytesRead = 0 # 单次读取源流,同步写入所有目标流 while (($bytesRead = $sourceStream.Read($buffer, 0, $buffer.Length)) -gt 0) { foreach ($stream in $targetStreams) { $stream.Write($buffer, 0, $bytesRead) } } # 强制刷入所有缓冲区数据到磁盘,避免缓存导致的文件不完整 foreach ($stream in $targetStreams) { $stream.Flush() } } finally { # 释放所有IO资源 $sourceStream.Dispose() foreach ($stream in $targetStreams) { $stream.Dispose() } } # 可选:自动完成所有文件哈希校验,无人值守也可确认拷贝正确性 $sourceHash = (Get-FileHash -Path $sourcePath -Algorithm MD5).Hash foreach ($path in $targetPaths) { $targetHash = (Get-FileHash -Path $path -Algorithm MD5).Hash if ($sourceHash -ne $targetHash) { Write-Error "拷贝异常:$path 哈希校验不匹配" # 可自定义告警逻辑,如写入日志、弹出系统提示等 } }
方案2:PowerShell 7+ 原生简化写法
若可升级到PowerShell 7.1及以上版本,系统为Get-Content、Tee-Object新增了-AsByteStream参数,管道传输时不会篡改二进制数据,写法更简洁:
Get-Content -Path "源文件路径" -AsByteStream -Raw | Tee-Object -Path "目标1路径" -AsByteStream | Tee-Object -Path "目标2路径" -AsByteStream | Out-Null
方案3:Win10 1809+ 原生GNU工具兼容写法
Win10 1809及以上版本自带GNU tar,搭配WSL或Git for Windows自带的tee.exe可直接复用Unix端的命令逻辑:
tar -cf - -C "源文件目录" . | tee >(tar -xf - -C "E:\存储卡1目录") >(tar -xf - -C "F:\存储卡2目录") > $null
内容的提问来源于stack exchange,提问作者mist42nz
相关产品推荐
相关产品推荐

