2013-04-05 66 views
2

我的脚本调用从脚本调用需要的参数的函数:在PowerShell中传递脚本参数的函数

function new($args) 
{ 
    if($args.length -lt 8) 
    { 
    Write-Host "Parameter Missing, requires 8 Parameters. Aborting."! 
    Write-Host $args.length 
    break 
    } 
} 

switch ($args[0]) { 
    '--test' { } 
    '--new' { new $args } 
    default { } 
} 

当我称呼它,args数组不移交给new功能:

PS Q:\mles\etl-i_test> .\iprog.ps1 --new 1 2 3 4 5 6 7 
Parameter Missing, requires 8 Parameters. Aborting. ! 
0 

如何将数组传递给PowerShell中的函数?或者特别是$ args数组? $ args数组的范围不应该是全局的吗?

+0

尝试使用'参数(...)' - http://stackoverflow.com/a/12425338/763026 – 2013-04-05 14:46:03

回答

2

修改如下你的函数:

function new { param([string[]] $paramargs) 

    if($paramargs.length -lt 8) 
    { 
    Write-Host "Parameter Missing, requires 8 Parameters. Aborting."! 
    Write-Host $paramargs.length 
    break 
    } 
} 

switch ($args[0]) { 
    '--test' { } 
    '--new' { new $args } 
    default { } 
} 

这将避免可变$arg的命令行和参数$arg(改变$paramarg)的模糊性。

+0

将$ args重命名为不同的伎俩,谢谢!是'param([string []]'必须的吗?它不需要。 – mles 2013-04-05 15:44:20

+0

Ya,'param([string []]'不是必需的。 – RinoTom 2013-04-06 17:41:30

1

您必须显式将$ args从父范围传递到子范围。父范围中的$ args在chlid范围内永远不可见,因为范围是用它自己的$ args初始化的。这样做:

&{get-variable -scope 0} 

并注意结果。您看到的每个变量都是在范围初始化时在新范围中本地创建的,因此父范围中的变量在新范围中不可见。 $ args是其中的一个变量。

+0

啊有趣。我不能覆盖函数中的$ args。 – mles 2013-04-05 15:43:07

2

$args始终是任何功能的一部分。当您以$args作为参数的名称调用函数时,事情会变得非常混乱。在你的功能名称更改为$args以外的东西,它应该工作。

function new($arguments) 
{ 

$arguments.Length 
    if($arguments.length -lt 8) 
    { 
    Write-Host "Parameter Missing, requires 8 Parameters. Aborting."! 
    Write-Host $arguments.length 
    break 
    } 
} 

switch ($args[0]) { 
    '--test' { } 
    '--new' { new $args } 
    default { } 
}