繁体   English   中英

Powershell:将参数传递给作业

[英]Powershell: passing parameters to a job

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

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
文尼斯罗
-CMSDB
管理信息系统
-CFROM
earn_n_deduct_ref
首席技术官
fin_earn_n_deduct_ref
-充分

但是调用脚本的输出表明,接收到的唯一参数是配置文件-其余所有参数均为默认值。

PS C:\\ ps>接收工作1391
12/17/2010 10:54:14开始上载表格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必须指定源数据库。 正在退出...

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

我不确定您到底要做什么,但这看起来是错误的:

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

您正在不必要地创建一个全新的Powershell流程。 尝试以下方法:

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

“ @args”语法称为“ splatting”。 这将扩展传递的参数,并确保将每个元素都视为一个参数。 “与”号(&)是“呼叫”运算符。

另一种方法是将@放在数组之前。 我将$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM