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

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”之类的关键字)的数组,然后将其传递给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
维尼米斯罗
-CMSDB
管理信息系统
-CFROM
earn_n_deduct_ref
-首席技术官
fin_earn_n_deduct_ref
-满的

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



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

最佳答案

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

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

您将不必要地创建一个全新的Powershell流程。尝试以下方法:
start-job  -scriptblock {
    & 'c:\ps\bcpCopy.ps1' @args } -ArgumentList $ARGS

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

关于Powershell:将参数传递给作业,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4472284/

10-14 14:50
查看更多