2

我的脚本调用了一个函数,该函数需要脚本调用中的参数:

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 数组的范围不应该是全局的吗?

4

3 回答 3

3

修改您的功能如下:

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)。

于 2013-04-05T15:11:32.793 回答
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  { }
}
于 2013-04-05T15:45:20.310 回答
1

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

&{get-variable -scope 0}

并记下结果。您看到的每个变量都是在初始化作用域时在新作用域中本地创建的,因此父作用域中的这些变量在新作用域中不可见。$args 是这些变量之一。

于 2013-04-05T15:00:13.333 回答