【问题标题】:How to use cmd type pipe (/piping) in PowerShell?如何在 PowerShell 中使用 cmd 类型管道(/管道)?
【发布时间】:2011-07-16 02:14:40
【问题描述】:

在 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 中工作,为什么不接受它的约定?
  • 您似乎正试图将文件列表传递给 zip 程序以压缩这些文件。如果是这种情况,我会重新表述您的问题,询问如何在 PowerShell 中完成此任务,而不是如何让 PowerShell 表现得像 DOS。

标签: windows powershell cmd pipe


【解决方案1】:

如果您想通过管道发送字符串,您可以使用 cmdlet "out-string"

例如:

get-process | out-string

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

http://pscx.codeplex.com

【讨论】:

  • 同意所有观点。 Powershell 的管道比 Unix/DOS 风格的管道要强大得多。即使可能,默认禁用它也是一个坏主意(tm)。谷歌认为可能有助于解释它。一般来说,Out-String 是将 Powershell 使用的对象流转换为 Unix/DOS 期望的文本流的命令。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果您可以将 (CMD) 目录的输出通过管道传输到 gzip,那么 gzip 显然知道如何解析 dir 输出。 PowerShell dir 命令(又名 Get-ChildItem)的(字符串)输出看起来不一样,因此 gzip 可能无法解析它。但是,我也猜测 gzip 会很乐意获取路径列表,所以这可能会起作用:

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

    没有明示或暗示的保证。

    【讨论】:

    • 这是我的建议。我认为依赖默认格式并不安全。
    【解决方案4】:

    如果您确实需要在 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`""
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多