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

Arrays 将脚本参数传递给Powershell中的函数,arrays,function,powershell,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 }

我的脚本调用的函数需要脚本调用中的参数:

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数组的作用域不应该是全局的吗?

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

&{get-variable -scope 0}

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

按如下方式修改函数:

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
)的歧义。

任何函数始终包含
$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  { }
}

尝试使用
参数(…)
-Ah有趣。我不能在一个函数中覆盖$args。将$args重命名为其他名称就可以了,谢谢!
param([string[]]
是必需的吗?它在没有.Ya的情况下可以工作,
param([string[]]
不是必需的。我尝试了这种方法并发布了so:)