如何将当前的powershell管道对象"$ _"作为命令行arg传递?

Lar*_*sen 4 svn powershell

我正在尝试在一组管道文件上设置所有svn:property:

dir * -include *.cs | Select-String -simplematch -pattern "HeadURL$" | select filename | svn propset svn:keywords "HeadURL Id LastChangedBy LastChangedRevision" $_
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

svn: Try 'svn help' for more info
svn: Explicit target required ('HeadURL Id LastChangedBy LastChangedRevision' interpreted as prop value)
Run Code Online (Sandbox Code Playgroud)

问题是,$ _没有传递给svn propset ...

该怎么办?

Joe*_*oey 10

对于$_有一个值,你必须在它实际上是设置了上下文中使用它.对于您的特定方案,这意味着您必须将调用包装svnForEach-Objectcmdlet中:

dir * -include *.cs | Select-String -simplematch -pattern "HeadURL$" | select filename | % { svn propset svn:keywords "HeadURL Id LastChangedBy LastChangedRevision" $_ }
Run Code Online (Sandbox Code Playgroud)

(%为简洁起见,我在这里使用了别名)

在里面,ForEach变量$_有一个值,可以使用.

但是,我已经看到了一些用途,当管道连接到非cmdlet时,当前管道对象被附加到程序的参数.但到目前为止,我还没有完全理解.

但是要理解你在这里做了什么:你正试图设置svn:keywords每个使用其中一个的文件.一种可能更强大和可读的方法是实际过滤您正在扫描的列表:

gci * -inc *.cs |
Where-Object {
    (Get-Content $_) -match 'HeadURL$'
}
Run Code Online (Sandbox Code Playgroud)

(可能有效,尚未测试)

然后,您可以继续将其连接到foreach中:

| ForEach-Object {
    svn ps svn:keywords "HeadURL Id LastChangedBy LastChangedRevision" $_.FullName
}
Run Code Online (Sandbox Code Playgroud)

此外,在这里您可以访问文件对象的所有属性,而不需要依赖于对象Select-String给您.