【问题标题】:Prevent PowerShell from "boxing" program output防止 PowerShell “装箱”程序输出
【发布时间】:2015-11-04 19:20:21
【问题描述】:

我正在尝试在 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 不理会标准输出(即让它成为“原始”),或者我做错了什么,或者我应该这样做的 PowerShell-y 方式会给出我想要的结果?

【问题讨论】:

  • 管道输出到cat -A而不是git,你会看到问题。 DOS 行尾。我不知道如何解决这个问题。
  • 我个人只会做cmd /c 'git log --cherry-pick master...branch --format=%h | git cherry-pick -n --stdin'

标签: git powershell pipe stdin msysgit


【解决方案1】:

假设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 中管道运算符的工作方式。

【讨论】:

  • "Unix 管道是字符流,而 PowerShell 管道是对象。您无法更改 PowerShell 中管道运算符的工作方式" - 我也这么认为,是的,我已经知道Foreach-Object 语法,我只是想知道我是否遗漏了一些明显的东西。显然不是。
猜你喜欢
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2011-06-16
  • 2017-10-23
  • 2022-01-10
  • 2011-02-20
  • 2023-03-11
相关资源
最近更新 更多