powershell - 如何防止 Powershell 使用 "Caching"管道数据

标签 powershell pipe powershell-2.0

我在命令窗口中执行以下命令:

"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin.exe" dump --quiet "C:\svnrepo" | "C:\Program Files\7-Zip\7z.exe" a -si "C:\svnbak.7z"

这会将我的 SVN 存储库的内容转储到一个接受的 7-zip 实例中,该实例将压缩的内容写入磁盘。当命令运行时,我可以观察到 7z 文件在运行直到完成时增加。

尝试将其放入 Powershell v2 脚本时,我 altered it到:

& "C:\Program Files (x86)\VisualSVN Server\bin\svnadmin.exe" dump --quiet "C:\svnrepo" | "C:\Program Files\7-Zip\7z.exe" a -si "C:\svnbak.7z"

它提示说“表达式只允许作为管道的第一个元素”。基于另一个 SO answer ,我将命令更改为:

& "C:\Program Files (x86)\VisualSVN Server\bin\svnadmin.exe" dump --quiet "C:\svnrepo" | & "C:\Program Files\7-Zip\7z.exe" a -si "C:\svnbak.7z"

Powershell 脚本似乎在运行,但没有看到文件正在缓慢写入,只有我的内存增加了。我假设 Powershell 不是将内容写入 7-zip 进程,而是“缓存”内容直到转储完成。转储完成后,内容将被推送到 7-zip。无论如何要防止这种情况发生(以获得与初始命令相同的结果)?

最佳答案

这与其说是解决方案,不如说是建议,但它可能对您的情况有所帮助。我对此进行了很多试验,在将数据全部加载到内存(然后是一些内存)之前,我无法将数据刷新到 7z。我的直觉是,当您使用管道时,“普通”shell 会获取第一个命令的标准输出并将其流式传输到第二个命令的标准输入。使用 PowerShell 一切皆对象。所以它试图传递对象并且在它全部加载之前不知道要传递什么样的对象。如果您的第一个命令生成一个字符串数组,而第二个命令可以使用管道中的一个数组,它可能会按预期工作。

这是部分解决方案:

New-Alias svnadmin "C:\Program Files (x86)\VisualSVN Server\bin\svnadmin.exe"
New-Alias 7z "C:\Program Files\7-Zip\7z.exe"
svnadmin dump --quiet "C:\svnrepo" > snvdump.txt 
Get-Content svndump.txt | 7z a -si "C:\svnbak.7z"

这使用的内存大约是表单解决方案的 1/5,但仍然多于应有的内存。在数据全部加载之前,它也不会将数据刷新到 7z,因此可能无法工作,具体取决于转储的大小。


更新:既然它在 CMD 而不是 PowerShell 中工作(并且 svnadmin 和 7z 是控制台应用程序而不是 cmdlet),为什么不直接调用 CMD?

 CMD /C """C:\Program Files (x86)\VisualSVN Server\bin\svnadmin.exe"" dump --quiet ""C:\svnrepo"" | ""C:\Program Files\7-Zip\7z.exe"" a -si ""C:\SourceCode\svnbak.7z"""

请注意,我的机器上没有 svn,所以我使用了一个大文本文件:

CMD /C "type files.txt | ""C:\Program Files\7-Zip\7z.exe"" a -si ""C:\SourceCode\svnbak.7z"""

CMD 应该在您的路径中,所以它应该可以正常工作。它在我的机器上要快得多,几乎没有内存。

关于powershell - 如何防止 Powershell 使用 "Caching"管道数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26023878/

相关文章:

Azure Devops Powershell 任务 : Programmatic Access of Build Variables

c - (在C 中模拟UNIX SHELL)如何在for 循环中实现多个管道?

文件描述符可以在不相关的进程之间共享吗?

r - 如何在R中关闭管道连接之前从管道连接获取输出?

powershell - 在powershell中运行N个并行作业

powershell - 在 PowerShell 中转义变量中的特殊字符

powershell - 计算目录中PDF文件的数量并输出到.csv

powershell - 将文件从一个源并行复制到多个目标

powershell - 在powershell中使用通用列表<T>时如何RemoveAll

azure - 有谁知道如何使用 Powershell 从 AzureAD 中提取动态组成员资格规则?