我有一个需要许多参数的脚本:
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")
从命令提示符调用时,例如
一切正常。 然而,我需要并行启动脚本的几个(几十个)实例,并且我编写了一个包装器脚本,该脚本调用作为工作执行实际工作的脚本: 我准备一个带有参数的数组(包括像“-CFG”这样的关键字)anhd将它传递给start-job:powershell。\ bcpCopy.ps1 -CFROM earn_n_deduct_actg -CTO fin_earn_n_deduct_actg -CCOL f_edeh_doc_id
# 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>接待工作1391
12/17/2010 10:54:14开始上传表无; source db none;
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必须指定源数据库。退出...
你能否指出我做错了什么?
答案 0 :(得分: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”。这将扩展传递的参数并确保将每个元素视为参数。 &符号(&)是“呼叫”运算符。
答案 1 :(得分:0)
另一种方法是将@放在数组之前。我将$ ARGS变量更改为$ flags以区分scriptblock中的$ 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