2011-02-25 71 views
2

我正在嘗試編寫一個基於配置文件將文件從單個源複製到多個目標的Microsoft PowerShell腳本。配置文件是一個CSV文件,該文件是這樣的:(\ myscript.ps1 buildnumber)將文件從一個源複製到多個目標並行

服務器,類型
server1的,生產
服務器2,分期

我的腳本是用一個參數調用,但它似乎沒有實際做任何刪除或複製文件。

我確定我的複製項目和刪除項目代碼的工作原理是因爲我已經獨立測試過它們,但我認爲它的問題在於我如何使用腳本塊或者我如何使用啓動工作。

任何人都可以幫助我理解爲什麼這不起作用嗎?當它從開始的在職稱爲

感謝 布拉德

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

} 
} 
+0

我把這個作爲評論或建議。你可能想看看模塊https://github.com/nightroman/SplitPipeline,這使得這類工作更容易。如果您的SCV包含大量要並行處理的數據(同時創建多個PS作業可能效率較低),則此功能尤其有用。 – 2012-10-15 03:57:29

回答

1

您的腳本塊沒有進入其外部聲明的變量。所以$ scriptblock1和$ scriptblock2不能看到$ sourcepath。

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 
相關問題