2011-12-16 78 views
13

基本上我有这样的代码:在PowerShell中是否存在“this”的等价物?

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

,我想知道是否有无论如何使用管道和PowerShell的等价的this重写它:

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

当我尝试这个我得到的错误:

Expressions are only allowed as the first element of a pipeline.

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

+1

好问题,安倍!当我第一次开始搞PS的时候,这让我感到有些不安。 – JNK 2011-12-16 17:01:45

回答

12

你在找什么是$_它代表了管道中的当前对象。然而,你只能在命令的脚本块是采用管道输入如访问$_

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

但也有对foreach对象cmdlet的别名{的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,任何你把括号内被视为其自己的对象,你可以申请不变量的方法来内联重新分配。

10

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

例如:

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

希望这有助于

0

分配并沉默默认的输出,但它并不能阻止一个对象被进一步引用。

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

。当然,这是更为常见的要么存储在一个变量返回值和做的东西与它链方法/属性/管道。

相关问题