Есть ли эквивалент "this" в powershell?
В основном у меня есть этот код:
$file = $web.GetFile("Pages/default.aspx")
$file.CheckOut()
и мне было интересно, если в любом случае использовать трубку и эквивалент powershell this
, чтобы переписать ее как:
$web.GetFile("Pages/default.aspx") | $this.CheckOut()
Когда я пытаюсь это сделать, я получаю сообщение об ошибке:
Выражения разрешены только в качестве первого элемента конвейера.
Я также попытался использовать $_
вместо $this
, но получил ту же ошибку.
Ответы
Ответ 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()
Разумеется, для гораздо более важно хранить возвращаемое значение в переменной и делать что-то с ней или цепными методами/свойствами/трубами.