我想将“传统”命令中的stdout传送到powershell中,但是我找不到正确的语法。例如,在这里我想通过以下方式获得最后一行的输出git tag
:
git tag | Get-Content -Tail 1
上面的方法不起作用,因为 The input object cannot be bound to any parameters for the command
这是怎么做的?我希望我不必使用中间文件。
的原因
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断言),遗留的命令的输出IS(通常)字符串(线)的阵列。这就是为什么(git tag)[-1]
给出最后一行。但是,如果遗留命令仅产生一行,则此操作将无效。在这种情况下,输出为单个字符串,而不是1个字符串的数组。因此(git tag)[-1]
将返回该行的最后一个字符。要强制输出始终为数组,请使用“ Array子表达式运算符” @
,如下所示:
@(git tag)[-1]
我不知道返回的行的格式,git tag
但总的来说$(<some legacy command>).split()
是错误的。
首先,这$
是多余的。它告诉powershell将()的内容评估为管道表达式,但是在命令行上使用()而不使用$
,则具有相同的含义。$()
在双引号(可扩展)字符串中使用,以插入表达式的字符串值。
其次,.split()
在legacy命令的结果上使用可能会导致2种效果之一。如果输出为单行,则为单个字符串并被.split()
调用。如果它是一个字符串数组(多行),则这将导致powershell执行成员枚举(因为Array
没有split方法)。在这两种情况下,效果都与
git tag | foreach { $_.split() }
调用会.split()
导致对的调用String.Split(char[])
,并为分隔符传递一个空数组。
每个分隔符元素定义一个单独的由单个字符组成的定界符。如果分隔符参数为null或不包含任何字符,则该方法将空格字符视为定界符。空格字符由Unicode标准定义;如果将它们传递给Char.IsWhiteSpace方法,则它们返回true。
最终的输出是将每个输入行拆分为单个词(如空白所界定)。
虽然我怀疑CharlWeed早就知道了正在发生的事情,但我还是为那些阅读此问题的人提供了此描述,以防止他们误导。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句