¿Cómo paso una variable local a un `Invoke-Command` remoto? [duplicar]
Estoy intentando recuperar el hash de un archivo ubicado en un servidor remoto usando Invoke-Command
. Funciona bien cuando doy la ruta completa como se muestra a continuación:
Invoke-Command -ComputerName winserver -ScriptBlock {
Get-FileHash -Path E:\test\testfile.zip -Algorithm SHA1
}
Pero necesito pasar el nombre del archivo mediante una variable como se muestra a continuación:
Invoke-Command -ComputerName winserver -ScriptBlock {
Get-FileHash -Path "E:\test\$dest.zip" -Algorithm SHA1
}
¿ Cómo accedo a esta variable en el caso scriptblock
de una sesión remota?
En PowerShell 4 (3+ en realidad), la forma más sencilla es utilizar el Using
modificador de alcance :
Invoke-Command -ComputerName winserver -ScriptBlock {
Get-FileHash E:\test\$Using:dest.zip -Algorithm SHA1
}
Para una solución que funcione con todas las versiones:
Invoke-Command -ComputerName winserver -ScriptBlock {
param($myDest)
Get-FileHash E:\test\$myDest.zip -Algorithm SHA1
} -ArgumentList $dest
Para complementar la útil respuesta de Briantist :
El bloque de script pasado Invoke-Command
se ejecuta (según lo previsto) en la máquina remota , utilizando las variables de la máquina remota de forma predeterminada.
Por lo tanto, para utilizar el valor de una variable local , se necesitan [1] pasos adicionales (para decirlo de otra manera: dentro de un bloque de script ejecutado de forma remota, no puede simplemente hacer referencia a las variables locales como lo haría normalmente, como con $dest
):
PS v3+ ofrece el
using:
modificador de alcance para el uso directo del valor de una variable local dentro del bloque de script ; consulte el primer comando de briantist.- Tenga en cuenta que
using:
solo funciona cuandoInvoke-Command
en realidad apunta a una máquina remota , como con el-ComputerName
parámetro.
- Tenga en cuenta que
La única opción que también funciona en versiones anteriores es pasar la variable local como parámetro al bloque de script. - ver el segundo comando de briantist.
Como un aparte:
- Debido a que los valores de las variables locales se someten a serialización , debido a que el bloque de secuencia de comandos remoto, por definición, se queda sin proceso , la fidelidad del tipo es limitada, aunque los tipos primitivos y las cadenas de .NET no se ven afectados; consulte esta respuesta para obtener más detalles.
[1] Tenga en cuenta que fundamentalmente no puede pasar una variable en sí , solo su valor ; es decir, no se puede asignar a una variable local en un bloque de script remoto.