Powershell - Commande «Copy-item» dans le scriptblock de Invoke-Command
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 :-
- Comment puis-je utiliser la commande "Copy-Item" dans "Invoke-Command (Scriptblock)" dans le script (2) pour copier le fichier?
- Y a-t-il un meilleur moyen d'y parvenir (c'est-à-dire les meilleures pratiques)?
Réponses
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