2010-12-17 192 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