2011-12-16 18 views
13

Básicamente tengo este código:¿Hay un equivalente de "esto" en Powershell?

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

y me preguntaba si hay alguna forma de utilizar un tubo y el PowerShell equivalente de this reescribir como:

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

Cuando intento esto obtener el error:

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

también he intentado usar $_ en lugar de $this pero obtuvo el mismo error.

+1

¡Buena pregunta, Abe! Esto me mordió un par de veces cuando empecé a jugar con PS. – JNK

Respuesta

12

Lo que está buscando es $_ y representa el objeto actual en la tubería. Sin embargo sólo se puede acceder en un $_ ScriptBlock de un comando que toma la entrada de tuberías por ejemplo:

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

Sin embargo, hay alias del cmdlet Foreach-Object {Foreach y%} y -Proceso es el parámetro por defecto por lo que este puede simplificarse a:

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

otro punto, la llamada GetFile aparece para devolver un único archivo por lo que en este caso, la siguiente sería la forma más fácil de ir:

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

Por supuesto, en este momento ya no tiene una variable que contenga el objeto de archivo.

1

$_ es la variable para "objeto actual" en powershell.

Sin embargo, no está pasando ningún dato, esto es solo la asignación de variables. Solo puede utilizar la canalización si manipula la salida real de un comando y lo utiliza como entrada en la tubería.

Creo que lo que desea se pueden lograr con paréntesis anidados:

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

En PS, cualquier cosa que poner paréntesis en el interior es tratado como su propio objeto, y se puede aplicar los métodos a que en línea sin variables reasignación.

10

En realidad, hay $ this en algunos casos. Puede crear ScriptProperty o ScriptMethod y adjuntarlo a un objeto, y $ this será el objeto original. A continuación, puede definir estos en archivos de tipos (recomendaría usar el módulo EZOut, hace la vida mucho más fácil) para que cada vez que vea ese tipo, obtenga ese método.

Por ejemplo:

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

Esperanza esto ayuda

0

de tarea hace silencio la salida por defecto, pero no impide que un objeto del que se hace referencia más.

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

Por supuesto, es mucho más común a ya sea almacenar el valor devuelto en una variable y hacer cosas con TI o cadena métodos/propiedades/tuberías.