如何在PowerShell中使用cmd类型管道(/piping)?

4
在 cmd(和 bash)中,“|” 管道符可以将输出以第一个命令的字符串格式传递给另一个命令。
在 PowerShell 中,管道符输出的所有内容都是对象(即使是字符串也是字符串对象)。
因此,有些命令在 PowerShell 命令窗口中运行时会失败,而在 Windows 命令窗口中则不会。
例如:
dir c:\windows | gzip > test.gz

当在Windows命令提示窗口中运行此命令时,它可以正常工作 - C:\windows目录列表被压缩成test.gz文件。
相同的命令在PowerShell中失败,因为PowerShell不使用cmd风格的管道,而是将其替换为PowerShell管道(使用文件系统项数组)。
问:如何禁用PowerShell中的默认管道行为,使传统的Windows命令在PowerShell中的工作方式与之前相同?
我尝试在管道符“|”之前使用转义字符“`”,但它没有起作用。我还尝试过invoke-expression -command "command with | here",但也失败了。

为什么要规避这个问题?如果你正在使用PowerShell,为什么不接受它的约定呢? - oɔɯǝɹ
4
看起来你正在尝试将一个文件列表传递给一个压缩程序以压缩这些文件。如果是这种情况,我会重新表述你的问题,询问如何在PowerShell中完成此操作,而不是让PowerShell像DOS一样行事。 - Aaron Jensen
4个回答

7
如果您想将字符串发送到管道中,则可以使用命令 "out-string"。
例如:
get-process | out-string

如果您正在寻找一种使用PowerShell压缩文件的方法,请查看PowerShell社区扩展。这里有许多用于压缩和解压各种文件的cmdlet。 http://pscx.codeplex.com

在所有方面都达成了一致。 Powershell的管道比Unix / DOS风格的管道更强大。 即使可能,禁用它也是一个坏主意(tm)。 Google认为这可能有助于解释。 一般来说,Out-String是将Powershell使用的对象流转换为Unix / DOS所期望的文本流的命令。 - David Pope

4
如果您可以将(CMD) dir的输出导入gzip,则gzip显然知道如何解析dir的输出。PowerShell dir命令(又名Get-ChildItem)的字符串输出看起来不同,因此gzip可能无法解析它。但是,我猜gzip也可以接受路径列表,所以这应该可以工作:
dir c:\windows | select -ExpandProperty FullName | gzip > test.gz

不提供任何明示或暗示的保证。


这是我建议的。我认为依赖默认格式不安全。 - JasonMArcher

1
如果你确实需要在PowerShell中使用老式的DOS管道系统,可以通过在单独的临时DOS会话中运行命令来完成:
& cmd /c "dir c:\windows | gzip > test.gz"

/c开关告诉cmd运行命令然后退出。当然,这只适用于所有命令都是老式DOS命令的情况 - 不能将它们与PowerShell命令混合使用。

虽然有针对问题中所示示例的PowerShell替代方案,但有许多使用旧管道系统的DOS程序,在PowerShell中无法工作。其中一个我很高兴处理的是svnadmin load


小的补充:1)您可以省略'&'符号;2)如果您想在命令中使用引号,可以使用引号转义:cmd /c "dir c:\windows | gzip > \"test archive.gz\"" - PolarBear

0

不行。PowerShell旨在通过管道传递对象,而不是文本。没有向后兼容到DOS的模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接