在powershell中有相当于“this”的东西吗?

时间:2011-12-16 16:56:25

标签: powershell

基本上我有这段代码:

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

我想知道是否还有使用管道和powershell等同于this来重写它:

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

当我尝试这个时,我得到错误:

  

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

我也尝试使用$_代替$this,但却遇到了同样的错误。

4 个答案:

答案 0 :(得分:12)

您正在寻找的是$_,它代表了管道中的当前对象。但是,您只能访问接受管道输入的命令的脚本块中的$_,例如:

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

但Foreach-Object cmdlet {Foreach和%}存在别名,而-Process是默认参数,因此可以简化为:

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

另一点,GetFile调用似乎返回一个文件,因此在这种情况下,以下是最简单的方法:

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

当然,此时您不再拥有包含文件对象的变量。

答案 1 :(得分:11)

实际上在少数情况下会有$ this。您可以创建ScriptProperty或ScriptMethod并将其附加到对象,$ this将是原始对象。然后你可以在类型文件中定义它们(我建议使用模块EZOut,它可以让生活变得更轻松),这样当你看到那种类型时,你就会得到那种方法。

例如:

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

希望这有帮助

答案 2 :(得分:1)

$_是powershell中“当前对象”的变量。

但是,您没有传递任何数据,这只是变量赋值。如果操作命令的实际输出并将其用作管道输入,则只能使用管道。

我认为你想要的是用嵌套括号来完成的:

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

在PS中,您放在括号内的任何内容都会被视为自己的对象,您可以将方法应用于内联而无需重新分配。

答案 3 :(得分:0)

分配会使默认输出静音,但不会阻止对象被进一步引用。

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

当然,要么将变量存储在变量中并使用链式方法/属性/管道进行处理,这更为常见。