Чтобы $_
имел значение, вы должны использовать его в контексте, где оно фактически установлено. Для вашего конкретного сценария это означает, что вы должны заключить вызов в svn
в командлет ForEach-Object
:
dir * -include *.cs | Select-String -simplematch -pattern "HeadURL$" | select filename | % { svn propset svn:keywords "HeadURL Id LastChangedBy LastChangedRevision" $_ }
(для краткости я использовал здесь псевдоним %
)
Внутри этого ForEach
переменная $_
имеет значение и может использоваться.
Однако я видел некоторые случаи, когда текущий объект конвейера добавлялся к аргументам программы при передаче в некомандлеты. Я до сих пор не до конца понял это.
Но чтобы понять, что вы здесь делаете: вы пытаетесь установить svn:keywords
для каждого файла, который использует один из них. Вероятно, более надежный и читабельный подход будет на самом деле фильтр список, который вы сканируете:
gci * -inc *.cs |
Where-Object {
(Get-Content $_) -match 'HeadURL$'
}
(может работать, не проверял)
Затем вы можете продолжить, просто добавив это в foreach:
| ForEach-Object {
svn ps svn:keywords "HeadURL Id LastChangedBy LastChangedRevision" $_.FullName
}
Кроме того, здесь вы можете получить доступ ко всем свойствам файлового объекта, и вам не нужно полагаться на объект *, который дает вам Select-String