Копирование файлов из одного источника в несколько мест назначения параллельно - PullRequest
2 голосов
/ 25 февраля 2011

Я пытаюсь написать сценарий Microsoft PowerShell, который копирует файлы из одного источника в несколько мест назначения параллельно на основе файла конфигурации. Файл конфигурации представляет собой файл CSV, который выглядит следующим образом:

Сервер, тип
сервер1, производство
server2, Staging

Мой скрипт вызывается с одним аргументом (. \ Myscript.ps1 buildnumber), но, похоже, он фактически не выполняет никакого удаления или копирования файлов.

Я уверен, что мой код copy-item и remove-item работает так, как я тестировал их независимо, но я думаю, что это либо проблема с тем, как я использую блоки скриптов, либо, возможно, как я использую start-job.

Может ли кто-нибудь помочь мне понять, почему это не работает?

Спасибо Бред

<#  
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

}
}

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Ваш блок скрипта не имеет доступа к переменным, объявленным вне его, когда он вызывается из start-job.Таким образом, $ scriptblock1 и $ scriptblock2 не могут видеть $ sourcepath.

0 голосов
/ 15 октября 2012

Чтобы уточнить ответ Jamey , вы можете увидеть, что переменная $sourcepath, объявленная в области вызова, недоступна в задании, сравнив выходные данные двух вызовов ниже:

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

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


Чтобы это исправить, просто передайте внешнюю переменную как часть списка аргументов:

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

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

...
Start-Job -Scriptblock $scriptblock2 -ArgumentList $sourcepath,$server
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...