2010-12-17 187 views
5

予有需要大量的參數的腳本:Powershell的:將參數傳遞給作業

param ([string]$FOO="foo",[string]$CFG='\ps\bcpCopyCfg.ps1', [string]$CFROM="none", ` 
[string]$CTO="none", [switch]$HELP=$FALSE, [switch]$FULL=$FALSE, [string]$CCOL="none" ` 
,[string]$CDSQUERY="none", [string]$CMSSRV="none" ` 
,[string]$CSYBDB="none", [string]$CMSDB="none") 

從命令提示時調用例如

的PowerShell。\ bcpCopy.ps1 -CFROM earn_n_deduct_actg -CTO fin_earn_n_deduct_actg -CCOL f_edeh_doc_id

一切工作正常。 然而,我需要並行啓動幾個(幾十個)腳本實例,並且我編寫了一個包裝腳本,它將調用實際工作作爲一項工作的腳本: 我準備一個包含關鍵字(如「 -cfg「)anhd通過它來啓動工作:

# Prepare script block to be released 
    $ARGS=("-CFG ", $CFG, "-CSYBDB ", $SYBDB, "-CMSDB ",$MSDB, "-CFROM ", $SYBTBL, "-CTO ",$MSTBL) 
    if ($FULL) { 
     $ARGS = $ARGS + " -FULL" 
    } else { 
     $ARGS = $ARGS + " -CCOL $($args[5]) " 
    } 
    "Argument array:" 
    $ARGS 

    start-job -scriptblock {powershell.exe -file '\ps\bcpCopy.ps1'} -ArgumentList $ARGS 

不幸的是,被調用的腳本不接收參數:主叫打印陣列,它看起來罰款:

參數數組:
- CFG
\ ps \ bcpCopyCfgOAH.ps1
-CSYBDB
vnimisro
-CMSDB
IMIS_UNOV
-CFROM
earn_n_deduct_ref
-CTO
fin_earn_n_deduct_ref
- 全

但從稱爲腳本輸出表示,收到的唯一參數是配置文件 - 其餘的都是默認值。

PS C:\ PS>接受在職1391
12/17/2010 10時54分14秒開始表沒有任何的上傳;源數據庫無;
12/17/2010 10:54:14目標表是無;目標數據庫是無;
12/17/2010 10:54:14配置文件是\ ps \ bcpCopyCfg.ps1。
12/17/2010 10:54:14目標服務器(MS SQL)是secap900-new
12/17/2010 10:54:14必須指定源數據庫。退出...

你能指點我做錯了什麼嗎?

回答

6

我不知道你想要做的事情,但是這看起來錯誤:

start-job -scriptblock { 
    powershell.exe -file '\ps\bcpCopy.ps1'} -ArgumentList $ARGS 

你是在不必要創建一個全新的PowerShell進程。試試這個:

start-job -scriptblock { 
    & 'c:\ps\bcpCopy.ps1' @args } -ArgumentList $ARGS 

「@args」語法被稱爲「splatting」。這將擴展傳遞的參數並確保每個元素都被視爲一個參數。和號(&)是「呼叫」操作符。

+0

謝謝你的建議。 – Lubo 2010-12-17 21:22:37

+0

感謝您的建議。現在這些工作被釋放,似乎掛着什麼都不做。繼續掛起,即使我在啓動後立即在腳本中放置一個退出並打印參數。順便說一句,這種啓動任務的方式任務mngr仍然顯示15個PowerShell處理 - 正是#我開始 – Lubo 2010-12-17 21:27:09

+0

,也是手動停止作業後,接收作業不會返回任何東西 – Lubo 2010-12-17 21:31:53

0

另一種方法是將@放在數組之前。我將$ ARGS變量更改爲$ flags,以區分$ flags中的$ args。

$flags = @("-CFG ", $CFG, "-CSYBDB ", $SYBDB, "-CMSDB ",$MSDB, "-CFROM ", $SYBTBL, "-CTO ",$MSTBL) 

If($FULL) { 
    $flags = $flags + " -FULL" 
} 
Else { 
    $flags = $flags + " -CCOL $($args[5]) " 
} 
"Argument array:" 
$flags 

start-job -scriptblock {powershell.exe -file '\ps\bcpCopy.ps1' $args} -ArgumentList $flags