阻止 PowerShell "boxing" 程序输出

Prevent PowerShell from "boxing" program output

我正在尝试 运行 PowerShell 中的以下命令:

git log --cherry-pick master...branch --format=%h | git cherry-pick -n --stdin

git log 生成一个以换行符分隔的提交哈希列表,然后我想将其传递给 git cherry-pick。然而,git cherry-pick总是抱怨:

'atal: bad revision '12abcdef

其中 12abcdefgit log 返回的第一行。请注意,上面 不是 错字 - 输出确实像那样被破坏了。

问题似乎是 PowerShell 正在将 git log 输出转换为字符串数组,然后尝试将其通过管道传递给 git cherry-pick,这很糟糕,因为它不知道 PS 对象;它只需要来自标准输入的原始文本。我猜这与我在上面看到的损坏的输出有关,但我不确定。

如果我通过 cmd.exegit bash 运行 相同的命令,一切都按预期工作。我在 git log 输出上尝试了各种 PS 命令,试图让它保持原始状态(joinout-string 等),但没有任何效果。

那么,有没有办法告诉 PowerShell 单独保留 stdout(即让它成为 "raw"),或者我做错了什么,或者我应该做的是 PowerShell-y 方式这会给我想要的结果吗?

假设 git log --cherry-pick 像我预期的那样工作,最类似于 PowerShell 的方法可能是这样的:

foreach ($cherry in $(git log --cherry-pick master...branch --format=%h)) {
    git cherry-pick -n $cherry
}

或者像这样:

git log --cherry-pick master...branch --format=%h | ForEach-Object {
    git cherry-pick -n $_
}

或者如果您必须简洁:

git log --cherry-pick master...branch --format=%h | % { git cherry-pick -n $_ }

我怀疑是否有一种方法可以使用非常干净的管道来完成此操作,因为 Unix 管道是字符流,而 PowerShell 管道是对象。您将无法更改 PowerShell 中管道运算符的工作方式。