PowerShell 中是否有类似于 "this" 的等效关键字?

16

基本上我有这段代码:

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

我想知道是否有一种方法可以使用管道和PowerShell中等效的 this 来重写它:

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

尝试这个代码时,我遇到了以下错误:

表达式只允许作为管道的第一个元素。

我也尝试使用$_代替$this,但出现了相同的错误。


1
好问题,Abe!当我第一次开始尝试使用PS时,这个问题困扰了我几次。 - JNK
对于类内的函数,使用 $this 来引用调用该函数的给定类的实例。 - Dave F
4个回答

13

实际上在一些情况下会存在$this。你可以创建ScriptProperty或ScriptMethod并将其附加到对象上,$this 将是原始对象。然后你可以在类型文件中定义这些方法(我建议使用模块EZOut,这会让生活更轻松),这样每次看到该类型时,您都会得到该方法。

例如:

$Web  | Add-Member ScriptMethod EditFile { $this.Checkout() }
希望这能有所帮助。

参考链接: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-6#this - marsze

12

你需要的是$_,它代表管道中的当前对象。但是你只能在一个接受管道输入命令的脚本块中访问$_,例如:

$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()

当然,在这个时候,您不再拥有包含文件对象的变量。


1

$_ 是 PowerShell 中表示“当前对象”的变量。

然而,您并没有传递任何数据,这只是变量赋值。只有在操作命令的实际输出并将其作为管道下游的输入时,才能使用管道。

我认为您想要的可以通过嵌套括号来实现:

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

在PS中,任何你放在括号内的东西都会被视为自己的对象,并且你可以在不重新分配变量的情况下对其进行内联方法应用。

0

赋值确实会使默认输出静默,但它并不能阻止对象被进一步引用。

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

当然,更常见的做法是将返回值存储在变量中并对其进行操作,或者链接方法/属性/管道。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接