Как передать текущий объект-канал powershell "$ _" как аргумент командной строки? - PullRequest
4 голосов
/ 21 июля 2009

Я пытаюсь установить все свойства svn: для набора переданных по каналу файлов:

dir * -include *.cs | Select-String -simplematch -pattern "HeadURL$" | select filename | svn propset svn:keywords "HeadURL Id LastChangedBy LastChangedRevision" $_

Я получаю следующую ошибку:

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

Проблема в том, что $ _ не передается в svn propset ...

Что делать?

1 Ответ

10 голосов
/ 21 июля 2009

Чтобы $_ имел значение, вы должны использовать его в контексте, где оно фактически установлено. Для вашего конкретного сценария это означает, что вы должны заключить вызов в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...