Powershell: comando "Copiar elemento" en el bloque de secuencias de comandos de Invoke-Command

Sep 02 2020

Necesito copiar el archivo de un servidor remoto a otro usando el script de PowerShell.

Lo que he probado: -

Mientras uso los siguientes comandos de PowerShell, funciona bien. (Significa archivo copiado de un servidor a otro)

Pero mientras uso el siguiente script, aparece el error "no se puede encontrar la ruta ..." de la siguiente manera

En realidad, el archivo existe en esa ruta.

He intentado consultar el siguiente desbordamiento de pila ya pregunta-respuesta

  • Error con el comando de PowerShell para copiar el archivo al servidor remoto con credencial
  • El parámetro 'Sesión' es nulo o está vacío en el script de PowerShell
  • control remoto powershell
  • Invoke-Command con sesión remota: no se puede validar el argumento en el parámetro
  • No se puede copiar un binario en una máquina virtual de Azure remota
  • Comando de PowerShell para copiar un archivo en una máquina remota

También he intentado obtener ayuda para usar

 Get-Help Invoke-Command

Pregunta :-

  1. ¿Cómo puedo utilizar el comando "Copiar elemento" dentro de "Invocar-Comando (Scriptblock)" en el script (2) para copiar el archivo?
  2. ¿Existe alguna mejor manera de lograr esto (significa mejores prácticas)?

Respuestas

T-Me Sep 03 2020 at 19:50

Invoke-Commandtiene el parámetro -ArgumentListque se puede utilizar para suministrar los valores de las variables locales en la sesión remota. El problema es: es solo el VALOR de la variable. ¡Ningún archivo!

Qué puede hacer:
Úselo Get-Content -Rawen archivos pequeños para guardar el contenido en una variable. En el sistema de destino, cree un archivo New-Itemcon el -Valuede ese archivo. Sin embargo, eso no es muy eficaz.

Ejemplo:

$txt = Get-Content -Raw -Path "C:\test\oldFile.txt" $Session = New-PSSession 127.0.0.1
Invoke-Command -Session $Session -ScriptBlock { Param($Txt) New-Item -Path c:\test\newFile.txt -Value $txt } -ArgumentList $txt 
#Get-PSSession | Remove-PSSession

Resultado:

   Verzeichnis: C:\test    # Sry german OS


Mode                LastWriteTime         Length Name                      PSComputerName           
----                -------------         ------ ----                      --------------           
-a----       03.09.2020     12:23         658033 newFile.txt               127.0.0.1  

Qué debe hacer:
creo que su uso Copy-Item -ToSession $Sessiones la forma correcta de hacerlo. Literalmente está hecho solo para su propósito. La desventaja es que el directorio de destino debe existir. Pero necesita una PSSession para ambos cmdlets de todos modos. Entonces puedes usarlo Invoke-Commandcon la misma PSSession. Primero cree una PSSession. Úselo Invoke-Commandpara crear su directorio. Luego use Copy-Itempara mover su archivo al lugar correcto. Por último, puede utilizar Invoke-Commandpara hacer algunos pasos finales. Y no te olvides de Remove-PSSessioncuando hayas terminado:

$DestinationPath = "C:\test"
Invoke-Command -Session $Session -ScriptBlock { Param($Destination) New-Item -Path $Destination -ItemType Directory } -ArgumentList $DestinationPath
Copy-Item -Path "C:\test\oldFile.txt" -ToSession $Session -Destination "c:\test\newFile.txt" Invoke-Command -Session $Session -ScriptBlock { write-host "Do some stuff" }
$Session | Remove-PSSession