Подтвердить что ты не робот

Есть ли эквивалент "this" в powershell?

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

Например:

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

Разумеется, для гораздо более важно хранить возвращаемое значение в переменной и делать что-то с ней или цепными методами/свойствами/трубами.