将脚本参数传递给Powershell中的函数

时间:2013-04-05 14:28:42

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

3 个答案:

答案 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是其中一个变量。