【发布时间】:2022-01-07 01:19:02
【问题描述】:
我正在使用小型笔记本电脑将现场视频文件复制到多个记忆棒 (~8GB)。 复制一旦开始就必须在没有监督的情况下完成,并且必须快速。
我已经确定了速度的严重界限,即在制作多个副本时(例如,4 个棒,来自 2 个摄像头,即 8 次传输 * 8Gb),多次读取会占用大量带宽,尤其是因为摄像头是 USB2。 0 接口(两个端口),容量有限。
如果我有 unix,我可以使用 tar -cf - |三通焦油-xf /stick1 | tee 焦油 -xf /stick2 等 这意味着我只需在 USB2.0 接口上从每个摄像头提取 1 个副本 (2*8Gb) 一次。
记忆棒通常在一个USB3.0接口上的集线器上,在不同的通道上驱动,因此写入速度足够快。
由于某些原因,我无法使用当前的 Win10 PowerShell。
我目前正在将整个命令写入一个字符串(连接各种来源和各种目标),然后使用 Invoke-Process 执行复制过程,同时我正在娱乐并在拍摄后在酒吧购买回合. (因此必须 afk)。
我可以 tar cf - | tar xf 单个文件,但似乎无法使 tee 正常运行。
我还可以成功地使用 microSD 插槽做一个相机卡,它的物理性能不是很好,但在一个相机录制时速度很快,但我仍然有剩余相机的带宽问题。我们可能会同时使用 4-5 个源摄像头,这意味着一次读取、多次写入仍然是一个问题。
编辑:我刚刚升级到使用 Get-Content -raw |三通 \stick1\f1 |三通 \stick2\f1 |出空。还没有做计时或文件验证....
Edit2:看起来 Get-Content -raw 工作正常,但 PowerShell 管道的功能违反了编程的两条基本戒律:程序应该做一件事并做好,你不应该弄乱数据溪流。 由于某些未知原因,PowerShell 默认(且唯一)管道行为总是修改它应该从一个流传输到下一个流的数据流。似乎没有 -raw 选项,也没有我可以设置的 $session 或 $global 来补救残缺。
PowerShell 人员如何将原始二进制文件从一个流传输到下一个流程?
【问题讨论】:
-
我认为问题不在于管道,而在于
Tee-Object的编码。您使用的是哪个 PowerShell 版本(检查变量$PSVersionTable)? -
从 PowerShell 7.2 开始,外部程序的输出在进一步处理之前总是被解码为文本,这意味着原始字节输出都不能被传递通过
|或>捕获 - 性能总是会受到影响。解决方法是通过cmd /c(Windows)/sh -c(类Unix平台)调用您的外部程序,并使用他们的|和>运算符。见this answer。 -
如果您在 Windows 10 机器上安装 Linux 的 Windows 子系统 “此处显示了一组入门命令,但您可以通过以下方式为任何 Linux 命令生成包装器“ docs.microsoft.com/en-us/windows/wsl/about>
-
@StackProtector,这绝对是管道。我可以这样做: (PS 5.1) $t = [System.Collections.ArrayList]@() foreach( $stick in $ws ) { #ws 是目标驱动器的 AL $t.Add( -join( $stick, "\ " , $i) ) | Out-Null } 写入输出“复制 $i” get-content -Raw -Encoding Byte -Path $s | Set-Content -Encoding Byte -Path $t Byte 将二进制转换为十进制数,例如“”=“32'r'n”,每个字符在其自己的行中。在任何环境中传输文件都非常强大,但速度却很糟糕没有-RAW,但更糟糕的是> 1Mb?刚刚锁定
-
@NeoTheNerd 我确实可以,但这意味着要回到旧习惯,而不是跟上新的发展。另一个因素是这台机器是一台带有 SSD 的旧笔记本电脑,而且空间非常宝贵,所以我真的希望将安装和额外的库保持在最低限度,尤其是在仅添加单个功能/cmd 时。
标签: powershell file-io file-copying tee powershell-5.1