[英]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.