通过Windows上的管道使用7-zip压缩到tar.xz

时间:2015-04-29 05:03:10

标签: powershell pipe 7zip

我的命令行是这个(powershell):

$7z ="`"c:\Program Files\7-Zip\7z.exe`""
&$7z a -r -ttar -bd -so . | &$7z a -r -txz -bd $archive -si

生成的存档文件确实包含tar文件,但该tar文件已损坏。

注意,将管道分成两个命令可以正常工作:

&$7z a -r -ttar -bd ${archive}.tmp .
&$7z a -r -txz -bd $archive ${archive}.tmp

制作的档案完全有效。

那么,我的管道出了什么问题?

(我正在使用Powershell)

2 个答案:

答案 0 :(得分:2)

您的管道没有任何问题,这是管道工作导致错误的方式。

PowerShell管道以异步方式工作。这意味着第一个命令的输出立即可用于第二个命令,即使第一个命令尚未完成执行,也只有一个对象,See here.

UnixPowerShell管道都以相同的方式运行。您可能会看到UnixPowerShell之间存在差异的原因是它们的实现方式不同。

Unix在命令之间传递StringsPowershell管道在命令之间传递full-fledged .net object的位置。在命令之间过去的数据类型的差异将是它在unix上而不在PowerShell中的原因。如果7z.exe无法正确处理这些.net objects,则文件将会损坏See here

答案 1 :(得分:1)

尝试在管道之间添加aid,例如

13

关键是对14的第二次调用需要 STDIN 上的未修改数据,但PowerShell正在将第一次调用的输出转换为import re def series2string(myserie) : myserie2 = ' or '.join(serie for serie in myserie) return myserie2 def expression(pattern, mystring) : x = re.findall(pattern, mystring) if len(x)>0: return 1 else: return 0 #text example text = "\n\n (troisième chambre)\n i - vu la requête, enregistrée le 28 février 1997 sous le n° 97nc00465, présentée pour m. z... farinez, demeurant ... à dommartin-aux-bois (vosges), par me y..., avocat ;\n" #expressions to look out pattern1 = '^\s*vu.*\n' pattern2 = '^\s*\(\w*\s*\w*\)\s*.*?vu.*\n' pattern = [pattern1, pattern2] pattern = series2string(pattern) expression(pattern, text) 到(多次)(字符串)对象。 | %{ "$_" }&$7z a -r -ttar -bd -so . | %{ "$_" } | &$7z a -r -txz -bd $archive -si 的别名,因此附加命令的作用是循环每个对象并将其转换为纯字符串,然后再将其传递给第二次调用7z。 / p>

编辑:通过PowerShell’s Object Pipeline Corrupts Piped Binary Data阅读它现在看起来好像我的建议不起作用,而且也无法修复它。好吧,除了将整个管道包装到7z调用以生成%而不是PowerShell处理管道。

Edit2:我也是从PowerShell Cookbook尝试this solution,但速度非常慢。

最后,我创建了一个foreach-object脚本,其中包含我从PowerShell脚本调用的7z个管道。