我想将标准输出从“遗留”命令传输到 powershell,但我找不到正确的语法。例如,在这里我想通过以下方式获取最后一行输出git tag
:
git tag | Get-Content -Tail 1
以上不起作用,因为The input object cannot be bound to any parameters for the command
这是怎么做到的?我希望我不必使用中间文件。
我想将标准输出从“遗留”命令传输到 powershell,但我找不到正确的语法。例如,在这里我想通过以下方式获取最后一行输出git tag
:
git tag | Get-Content -Tail 1
以上不起作用,因为The input object cannot be bound to any parameters for the command
这是怎么做到的?我希望我不必使用中间文件。
原因是
给出上述错误是 Get-Content 是预期结果的错误 cmdlet。您不能通过管道将内容传递给
Get-Content
,只能传递一些参数(按名称):如 LotPings 的答案所示,正确的 cmdlet 是
Select-Object
. 然而,正如其他建议所表明的(并且与 Charlweed 的断言相反),遗留命令的输出(通常)是一个字符串数组(行)。这就是为什么(git tag)[-1]
给出最后一行。但是,如果遗留命令只生成一行,这将不起作用。在这种情况下,输出是单个字符串,而不是 1 个字符串的数组。因此(git tag)[-1]
将返回该行的最后一个字符。要强制输出始终为数组,请使用“数组子表达式运算符”@
,如下所示:我不知道返回的行的格式,
git tag
但通常$(<some legacy command>).split()
是错误的。首先,
$
是多余的。它告诉 powershell 将 () 的内容评估为管道表达式,但在命令行上使用 () 没有$
, 具有相同的含义。$()
在双引号(可扩展)字符串中使用以插入表达式的字符串值。其次,
.split()
在 legacy 命令的结果上使用 of 会导致 2 个效果中的 1 个。如果输出是单行,则它是单个字符串并被.split()
调用。如果它是一个字符串数组(多行),那么这会导致 powershell 执行成员枚举(因为Array
没有拆分方法)。在这两种情况下,效果都是一样的调用
.split()
会导致调用String.Split(char[])
,并为分隔符传入一个空数组。生成的输出是将每个输入行拆分为单个单词(由空格分隔)。
虽然我怀疑 CharlWeed 早就知道发生了什么,但我为那些阅读这个问题的人提供了这个描述,以免他们被误导。