在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"
,但也失败了。
答案 0 :(得分:6)
如果要沿管道发送字符串,可以使用cmdlet“out-string”
例如:
get-process | out-string
如果您专门寻找PowerShell压缩文件的方法,请查看PowerShell社区扩展。有一堆cmdlet可以压缩和解压缩各种文件。
答案 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
是我很高兴与之打交道的一个。