将文件从一个源并行复制到多个目标

时间:2011-02-25 04:44:50

标签: powershell powershell-v2.0

我正在尝试编写一个microsoft powershell脚本,它根据配置文件将文件从单个源并行复制到多个目标。配置文件是一个CSV文件,如下所示:

服务器,类型
服务器1,生产
server2,暂存

我的脚本使用一个参数(。\ 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 个答案:

答案 0 :(得分:1)

当您从start-job调用时,您的脚本块无法访问在其外部声明的变量。所以$ scriptblock1和$ scriptblock2看不到$ sourcepath。

答案 1 :(得分:0)

要详细说明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