Есть ли эквивалент "этого" в powershell? - PullRequest
14 голосов
/ 16 декабря 2011

В основном у меня есть этот код:

$file = $web.GetFile("Pages/default.aspx")
$file.CheckOut()

, и мне было интересно, есть ли в любом случае использовать канал и эквивалент PowerShell this, чтобы переписать его как:

$web.GetFile("Pages/default.aspx") | $this.CheckOut()

Когда я пытаюсь это сделать, я получаю сообщение об ошибке:

Выражения допускаются только в качестве первого элемента конвейера.

Я также пытался использовать $_ вместо$this но получил ту же ошибку.

Ответы [ 4 ]

12 голосов
/ 16 декабря 2011

То, что вы ищете, это $_, и оно представляет текущий объект в конвейере. Однако вы можете получить доступ к $_ только в блоке сценария команды, которая принимает конвейерный ввод, например ::100100

$web.GetFile("Pages/default.aspx") | Foreach-Object -Process {$_.Checkout()}

Однако существуют псевдонимы для командлета Foreach-Object {Foreach and%}, и -Process является параметром по умолчанию, поэтому его можно упростить до:

$web.GetFile("Pages/default.aspx") | Foreach  {$_.Checkout()}

Еще один момент, вызов GetFile возвращает один файл, поэтому в этом случае проще всего будет выполнить следующее:

$web.GetFile("Pages/default.aspx").Checkout()

Конечно, на данный момент у вас больше нет переменной, содержащей объект файла.

11 голосов
/ 17 декабря 2011

На самом деле в некоторых случаях это $. Вы можете создать ScriptProperty или ScriptMethod и прикрепить его к объекту, и $ будет исходным объектом. Затем вы можете определить их в файлах типов (я бы порекомендовал использовать модуль EZOut , это значительно облегчает жизнь), так что каждый раз, когда вы видите этот тип, вы получаете этот метод.

Например:

$Web  | Add-Member ScriptMethod EditFile { $this.Checkout() }

Надеюсь, это поможет

1 голос
/ 16 декабря 2011

$_ - это переменная для «текущего объекта» в powershell.

Однако вы не передаете никаких данных, это просто присвоение переменной.Вы можете использовать конвейер, только если вы управляете фактическим выводом команды и используете его как ввод по конвейеру.

Я думаю, что вы можете достичь с помощью вложенных скобок:

($web.GetFile("Pages/default.aspx")).CheckOut()

В PS все, что вы помещаете в круглые скобки, обрабатывается как его собственный объект, и вы можете применять методы к этому встроенному элементу без переназначения переменной.

0 голосов
/ 24 октября 2017

Назначение отключает вывод по умолчанию, но не препятствует дальнейшим ссылкам на объект.

($file = $web.GetFile("Pages/default.aspx")).CheckOut()

Конечно, гораздо чаще либо сохраняют возвращаемое значение в переменной и делают с ней вещи или цепные методы / свойства / каналы.

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