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

时间:2011-03-15 19:57:38

标签: windows powershell cmd pipe

在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",但也失败了。

4 个答案:

答案 0 :(得分:6)

如果要沿管道发送字符串,可以使用cmdlet“out-string”

例如:

get-process | out-string

如果您专门寻找PowerShell压缩文件的方法,请查看PowerShell社区扩展。有一堆cmdlet可以压缩和解压缩各种文件。

http://pscx.codeplex.com

答案 1 :(得分:4)

如果你可以将(CMD)dir的输出传递给gzip,那么gzip显然知道如何解析dir输出。 PowerShell dir命令(又名Get-ChildItem)的(字符串)输出看起来不一样,因此gzip可能无法解析它。但是,我也猜测gzip很乐意采用一系列路径,所以这可能有用:

dir c:\windows | select -ExpandProperty FullName | gzip > test.gz

没有担保人明示或暗示。

答案 2 :(得分:0)

你做不到。 PowerShell旨在将对象传递到管道而不是文本。 DOS没有向后兼容模式。

答案 3 :(得分:0)

如果您确实需要在PowerShell中使用旧式的DOS管道系统,可以通过在单独的临时DOS会话中运行命令来完成:

& cmd /c "dir c:\windows | gzip > test.gz"

/c开关告诉cmd运行命令,然后退出。当然,这仅在所有命令都是老式DOS的情况下才有效-您无法将它们与PowerShell命令混合使用n-match。

尽管问题中给出的示例可以使用PowerShell替代,但仍有许多DOS程序使用旧管道系统,并且无法在PowerShell中运行。 svnadmin load是我很高兴与之打交道的一个。