¿Cómo paso una variable local a un `Invoke-Command` remoto? [duplicar]

Resuelto Bose asked hace 8 años • 2 respuestas

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 scriptblockde una sesión remota?

Bose avatar Feb 19 '16 04:02 Bose
Aceptado

En PowerShell 4 (3+ en realidad), la forma más sencilla es utilizar el Usingmodificador 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
briantist avatar Feb 18 '2016 21:02 briantist

Para complementar la útil respuesta de Briantist :

El bloque de script pasado Invoke-Commandse 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 cuando Invoke-Commanden realidad apunta a una máquina remota , como con el -ComputerNameparámetro.
  • 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.

mklement0 avatar Feb 18 '2016 21:02 mklement0