Powershell - Commande «Copy-item» dans le scriptblock de Invoke-Command

Sep 02 2020

J'ai besoin de copier le fichier d'un serveur distant à un autre en utilisant le script PowerShell.

Ce que j'ai essayé: -

Bien que j'utilise les commandes PowerShell suivantes, cela fonctionne correctement (signifie que le fichier est copié d'un serveur à un autre)

Mais tandis que j'utilise le script suivant, il donne l'erreur "Impossible de trouver le chemin ..." comme suit

En fait, le fichier existe sur ce chemin.

J'ai essayé de faire référence à la suite du débordement de pile déjà question-réponse

  • Erreur avec la commande PowerShell pour la copie du fichier sur le serveur distant avec des informations d'identification
  • Le paramètre 'Session' est nul ou vide dans le script PowerShell
  • télécommande PowerShell
  • Invoke-Command avec session à distance: impossible de valider l'argument sur le paramètre
  • Impossible de copier un binaire sur une machine virtuelle Azure distante
  • Commande PowerShell pour copier un fichier sur une machine distante

J'ai également essayé d'obtenir de l'aide en utilisant

 Get-Help Invoke-Command

Question :-

  1. Comment puis-je utiliser la commande "Copy-Item" dans "Invoke-Command (Scriptblock)" dans le script (2) pour copier le fichier?
  2. Y a-t-il un meilleur moyen d'y parvenir (c'est-à-dire les meilleures pratiques)?

Réponses

T-Me Sep 03 2020 at 19:50

Invoke-Commanda le paramètre -ArgumentListqui peut être utilisé pour fournir les valeurs des variables locales dans la session distante. Le problème est: c'est juste la VALEUR de la variable. Pas de fichier!

Ce que vous pouvez faire:
Utilisez Get-Content -Rawsur de petits fichiers pour enregistrer le contenu dans une variable. Sur le système cible, créez un New-Itemavec le -Valuede ce fichier. Cependant ce n'est pas très efficace.

Exemple:

$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

Résultat:

   Verzeichnis: C:\test    # Sry german OS


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

Ce que vous devez faire:
Je pense que votre utilisation de Copy-Item -ToSession $Sessionest la bonne façon de le faire. C'est littéralement fait juste pour votre but. L'inconvénient est que le répertoire cible doit exister. Mais vous avez quand même besoin d'une session PSSession pour les deux applets de commande. Vous pouvez donc utiliser Invoke-Commandavec la même session PSSession. Créez d'abord une session PSSession. Utilisez Invoke-Commandpour créer votre répertoire. Utilisez ensuite Copy-Itempour déplacer votre fichier au bon endroit. Enfin, vous pouvez utiliser Invoke-Commandpour effectuer certaines étapes de finition. Et n'oubliez pas de Remove-PSSessionquand vous avez terminé:

$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