2 votes

Copie de fichiers d'une source vers plusieurs destinations en parallèle

Je tente d'écrire un microsoft powershell script qui copie des fichiers d'une source unique vers plusieurs destinations en parallèle en fonction d'un fichier de configuration. Le fichier de configuration est un fichier CSV qui ressemble à ceci :

Serveur, Type
serveur1,Production
serveur2,Staging

Mon script est appelé avec un argument (. \myscript.ps1 buildnumber), mais il ne semble pas effectuer de suppression ou de copie de fichiers.

Je suis sûr que mon code copy-item et remove-item fonctionne car je les ai testés indépendamment mais je pense que c'est soit un problème avec la façon dont j'utilise les blocs script ou peut-être la façon dont j'utilise start-job.

Quelqu'un peut-il m'aider à comprendre pourquoi cela ne fonctionne pas ?

Merci Brad

<#  
File Deployment Script
#>
#REQUIRES -Version 2

param($build)
$sourcepath = "\\server\software\$build\*" 

$Config = import-csv -path C:\config\serverlist.txt 

$scriptblock1 = {
    $server = $args[0]
    $destpath1 = "\\$server\share\Software Wizard\"
    $destpath2 = "\\$server\share\Software Wizard V4.9XQA\"

    remove-item "$destpath1\*" -recurse -force
    remove-item "$destpath2\*" -recurse -force

    copy-item $sourcepath -destination $destpath1 -recurse -force
    copy-item $sourcepath -destination $destpath2 -recurse -force
}

$scriptblock2 = {
    $server = $args[0]
    $destpath = "\\$server\share\Software Wizard\"
    #remove-item "$destpath\*" -recurse -force 
    copy-item $sourcepath -destination $destpath -recurse -force
}

foreach ($line in $Config) {
    $server = $line.Server
    $type = $line.Type

    if ($type -match "Staging") {

    Write-Host "Kicking job for $server off"
    start-job -scriptblock $scriptblock2 -ArgumentList $server
}

if ($type -match "Production") {
            Write-Host "Kicking job for $server off"
    start-job -scriptblock $scriptblock2 -ArgumentList $server

}
}

1voto

Jamey Points 975

Votre bloc script n'a pas accès aux variables déclarées en dehors de lui lorsqu'il est appelé depuis start-job. Donc $scriptblock1 et $scriptblock2 ne peuvent pas voir $sourcepath.

0voto

Emperor XLII Points 5493

Pour développer Jamey Vous pouvez voir que la réponse de $sourcepath La variable déclarée dans la portée de l'appelant n'est pas disponible dans le job en comparant les résultats des deux appels ci-dessous :

$sourcepath = 'source path'
$scriptblock = { Write-Host "sourcepath = $sourcepath; args = $args" }

& $scriptblock 'server name'
Start-Job $scriptblock -ArgumentList 'server name' | Wait-Job | Receive-Job

Pour résoudre ce problème, il suffit de passer la variable externe comme faisant partie de la liste des arguments :

$scriptblock2 = {
  param($sourcepath, $server)

  $destpath = ...
  Copy-Item $sourcepath -Destination $destpath -Recurse -Force
}

...
Start-Job -Scriptblock $scriptblock2 -ArgumentList $sourcepath,$server

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X