5

我有一个需要许多参数的脚本:

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 将其传递给 start-job:

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

但是被调用脚本的输出表明接收到的唯一参数是配置文件——其余的都是默认值。

PS C:\ps> receive-job 1391
12/17/2010 10:54:14 开始上传表 none;源数据库无;
2010 年 12 月 17 日 10:54:14 目标表没有;目标数据库为无;
2010 年 12 月 17 日 10:54:14 配置文件是 \ps\bcpCopyCfg.ps1。
12/17/2010 10:54:14 目标服务器 (MS SQL) 是 secap900-new
12/17/2010 10:54:14 必须指定源数据库。退出...

你能指出我做错了什么吗?

4

2 回答 2

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”。这将扩展传递的参数并确保每个元素都被视为参数。与号 (&) 是“调用”运算符。

于 2010-12-17T18:18:40.340 回答
0

另一种方法是将 @ 放在数组之前。我将 $ARGS 变量更改为 $flags 以区分脚本块中的 $args 和 $flags。

$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
于 2014-01-10T07:11:26.267 回答