我的脚本调用一个需要调用脚本参数的函数:
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 :(得分: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
)的歧义。
答案 1 :(得分: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 { }
}
答案 2 :(得分:1)
您必须明确地将$ args从父作用域传递到子作用域。父作用域中的$ args永远不会在chlid作用域中可见,因为作用域是使用它自己的$ args初始化的。这样做:
&{get-variable -scope 0}
并注意结果。当初始化范围时,您在其中看到的每个变量都是在新范围内本地创建的,因此父范围中的那些变量在新范围中不可见。 $ args是其中一个变量。