Variables Remotas
Cuando utilice PowerShell Remoting, debe recordar que se trata de dos o más equipos que no comparten información entre ellos. Por ejemplo, el siguiente comando funcionará correctamente en su equipo local:
1 $f1 = 'D:\Scripts\folder1'
2 $f2 = 'D:\Scripts\folder2'
3 Copy-Item -Path $f1 -Recurse -Destination $f2 -Verbose -F\
4 orce
Sin embargo, si intenta ejecutar el comando Copy-Item en un equipo remoto, se producirá un error:
1 $f1 = "D:\Scripts\folder1"
2 $f2 = "D:\Scripts\folder2"
3
4 Invoke-Command -ComputerName MemberServer -ScriptBlock {\
5 Copy-Item -Path $f1 - Recurse -Destination $f2 -Verbose -\
6 Force}
7
8 Cannot bind argument to parameter 'Path' because it is n\
9 ull.
10 + CategoryInfo : InvalidData: [:] [Copy-Item], Parameter\
11 BindingValidationException
12 + FullyQualifiedErrorId : ParameterArgumentValidationErr\
13 orNullNotAllowed,Microsoft.PowerShell.Commands.CopyItemCo\
14 mmand
15 + PSComputerName : MemberServer
El problema es que $f1 y $f2 se definen en su equipo local, pero no en el equipo remoto. El bloque de secuencia de comandos enviado a Invoke-Command no se evalúa en su computadora, simplemente se pasa como está (as-is).
Hay dos posibles soluciones. La primera es simplemente incluir las definiciones de variables en el bloque de secuencia de comandos:
1 Invoke-Command -ComputerName MemberServer -ScriptBlock {
2 $f1 = "D:\Scripts\folder1"
3 $f2 = "D:\Scripts\folder2"
4 Copy-Item -Path $f1 -Recurse -Destination $f2 -Verbose -\
5 Force
6 }
Otra técnica, disponible en PowerShell v3 y posterior, es utilizar el designador de variable $using. PowerShell pre-escanea el bloque de secuencia de comandos y pasará los valores de la(s) variable(s) local(es) al (los) equipo(s) remoto(s).
1 $f1 = "D:\Scripts\folder1"
2 $f2 = "D:\Scripts\folder2"
3
4 Invoke-Command -ComputerName MemberServer -ScriptBlock {
5 Copy-Item -Path $using:f1 -Recurse -Destination $using:f\
6 2 -Verbose -Force}
El uso de la sintaxis especial $using: es lo que hace que esta versión del comando funcione.