基本上我有这段代码:
$file = $web.GetFile("Pages/default.aspx")
$file.CheckOut()
我想知道是否还有使用管道和powershell等同于this
来重写它:
$web.GetFile("Pages/default.aspx") | $this.CheckOut()
当我尝试这个时,我得到错误:
表达式仅允许作为管道的第一个元素。
我也尝试使用$_
代替$this
,但却遇到了同样的错误。
答案 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()
当然,要么将变量存储在变量中并使用或链式方法/属性/管道进行处理,这更为常见。