我试图理解参数是如何绑定到管道中cmdlet的第二个位置的。
已尝试使用Select-String [1]进行尝试。它具有-Path
,可接受位置1(第二个位置)处的管道输入。这些操作起作用:
sls "the-pattern" "the-file.txt"
"the-file.txt" | sls "the-pattern" -path {$_}
但这并不:
"the-file.txt" | sls "the-pattern"
在后一种情况下,我希望“the-file.txt”作为第二个参数绑定到sls
。
在Powershell中,第一个位置之后的参数绑定如何工作?
[1] https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string?view=powershell-7.3#parameters
1条答案
按热度按时间ezykj2lf1#
Get-Help
提供了回答您问题的关键信息:我们可以看到以下几点:
-LiteralPath
和-Path
都是按属性名绑定的,而-InputObject
是按值绑定的。知道了这一点,我们可以在第一个例子中假设如下:
"the-pattern"
在位置上结合到-Pattern
上。"the-file.txt"
在位置上结合到-Path
上。在第二个示例中:
"the-pattern"
在位置上结合到-Pattern
上。"the-file.txt"
使用延迟绑定脚本块通过名称绑定到-Path
**。在第三个例子中,它运行得很好,只是没有按照你预期的方式运行:
"the-file.txt"
通过来自管道的值绑定到-InputObject
。"the-pattern"
在位置上结合到-Pattern
上。您可以通过简单地尝试
"the-file.txt" | sls "the-file"
来了解这一点。至于你没有尝试的东西,
Trace-Command
对理解参数是如何绑定的有很大帮助。这个特殊的例子一开始很难理解,因为Select-String
总是从管道绑定-InputObject
,无论如何(这是因为参数类型为PSObject
)并且最有可能具有内部逻辑来确定何时应该将来自流水线的对象作为文件来对待并从其路径读取。下面是一个例子,我的意思是使用一个临时文件。
$tmp
应该绑定到-LiteralPath
,因为对象有.PSPath
属性,但它被绑定到-InputObject
:For anyone wondering, here is the logic in the source code where it checks if the input object is a
FileInfo
instance: https://github.com/PowerShell/PowerShell/blob/master/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs#L1502-L1509