如何在 powershell 中通过管道输出旧命令?

如何在 powershell 中通过管道输出旧命令?

我想将“旧版”命令的标准输出导入到 powershell,但找不到正确的语法。例如,这里我想通过以下方式获取最后一行输出git tag

git tag | Get-Content -Tail 1

上述方法不起作用,因为The input object cannot be bound to any parameters for the command

这是怎么做的?我希望我不必使用中间文件。

答案1

原因是

git tag | Get-Content -Tail 1

出现上述错误是因为 Get-Content 不是预期结果所需的错误 cmdlet。您无法通过管道内容Get-Content,仅列出部分参数(按名称):

Inputs
System.Int64, System.String[], System.Management.Automation.PSCredential

You can pipe the read count, total count, paths, or credentials to Get-Content.

正如 LotPings 的答案所指出的那样,正确的 cmdlet 是Select-Object。但是,正如其他建议所表明的那样(与 Charlweed 的断言相反),旧命令的输出(通常)字符串(行)数组。这就是为什么(git tag)[-1]给出最后一行。但是,如果旧命令只生成一行,这将不起作用。在这种情况下,输出是单个字符串,而不是 1 个字符串的数组。因此(git tag)[-1]将返回最后一行特点该行。要强制输出始终为数组,请使用“数组子表达式运算符”,@如下所示:

@(git tag)[-1]

我不知道由 返回的行的格式git tag,但一般来说,$(<some legacy command>).split()它是错误的。
首先,$是多余的。它告诉 powershell 将 () 的内容作为管道表达式进行评估,但在命令行上使用 ()(不带$)具有相同的含义。$()在双引号(可扩展)字符串中用于插入表达式的字符串值。其次,在旧命令的结果上
使用会导致 2 种效果中的 1 种。如果输出是一行,那么它就是一个字符串并被调用。如果它是一个字符串数组(多行),那么这会导致 powershell 执行成员枚举(因为没有 split 方法)。在这两种情况下,效果都与.split().split()Array

git tag | foreach { $_.split() }

调用.split()会导致对的调用String.Split(char[]),并传递一个空数组作为分隔符。

分隔符的每个元素定义一个由单个字符组成的单独分隔符。如果分隔符参数为 null 或不包含任何字符,则该方法将空格字符视为分隔符。空格字符由 Unicode 标准定义;如果将它们传递给 Char.IsWhiteSpace 方法,则它们返回 true。

最终的输出是将每一行输入分成单独的单词(以空格划分)。

虽然我怀疑 CharlWeed 早就知道发生了什么,但我还是为阅读该问题的人提供了这个描述,以免他们被误导。

相关内容