The Big Book of PowerShell Gotchas (Spanish)
  • Léame
  • Acerca de este libro
  • Formato a la derecha
  • ¿Dónde está el comando \?
  • PowerShell.exe no es PowerShell
  • Acumulando la salida en una función
  • ForEach vs ForEach vs ForEach
  • Finalización con Tab
  • -Contains y -Like son diferentes
  • No puede tener lo que no se tiene
  • -Filter y la diversidad de valores
  • No todo produce una salida
  • Una página HTML a la vez, por favor
  • Sangriento, Horrible, Puntuación
  • No Concatene Strings
  • $ no forma parte del nombre de la variable
  • Utilizar la canalización (pipeline), no una matriz
  • Backtick, Grave Accent, Escape
  • Comandos de la vieja escuela
  • Una multitud no es un individuo
  • La salida predeterminada de los comandos puede mentir
  • Propiedades vs. Valores
  • Variables Remotas
  • New-Object PSObject vs. PSCustomObject
  • Ejecutando algo como el "usuario actualmente conectado"
  • Comandos que necesitan un perfil de usuario pueden fallar cuando se ejecuta de forma remota
  • Escribiendo en SQL Server
  • Obtener tamaños de carpetas
Powered by GitBook
On this page

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:

$f1 = 'D:\Scripts\folder1'
$f2 = 'D:\Scripts\folder2'
Copy-Item -Path $f1 -Recurse -Destination $f2 -Verbose -Force

Sin embargo, si intenta ejecutar el comando Copy-Item en un equipo remoto, se producirá un error:

 $f1 = "D:\Scripts\folder1"
 $f2 = "D:\Scripts\folder2"

 Invoke-Command -ComputerName MemberServer -ScriptBlock {Copy-Item -Path $f1 - Recurse -Destination $f2 -Verbose -Force}

 Cannot bind argument to parameter 'Path' because it is null.
 + CategoryInfo : InvalidData: [:] [Copy-Item], ParameterBindingValidationException
 + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CopyItemCommand
 + 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:

 Invoke-Command -ComputerName MemberServer -ScriptBlock {
 $f1 = "D:\Scripts\folder1"
 $f2 = "D:\Scripts\folder2"
 Copy-Item -Path $f1 -Recurse -Destination $f2 -Verbose -Force
 }

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).

 $f1 = "D:\Scripts\folder1"
 $f2 = "D:\Scripts\folder2"

 Invoke-Command -ComputerName MemberServer -ScriptBlock {
 Copy-Item -Path $using:f1 -Recurse -Destination $using:f2 -Verbose -Force}

El uso de la sintaxis especial $using: es lo que hace que esta versión del comando funcione.

PreviousPropiedades vs. ValoresNextNew-Object PSObject vs. PSCustomObject

Last updated 7 years ago