【问题标题】:powershell pass command line argumentspowershell 传递命令行参数
【发布时间】:2012-02-07 22:41:16
【问题描述】:

这是我的代码:

$script={
 Write-Host "Num Args:" $args.Length;
  Write-Host $args[0]   
}

Invoke-Command  -ScriptBlock $script

当我跑步时

  powershell.exe .\test.ps1 one two three

我明白了

Num Args: 0

我以为我会得到

Num Args: 3
One

我错过了什么?

谢谢

【问题讨论】:

    标签: windows powershell powershell-2.0


    【解决方案1】:

    你实际上有两个范围。脚本级别和脚本块级别。 $args.Length$args[0] 将拥有您在 Invoke-Command 级别所期望的内容。在脚本块内,$args 有另一个作用域。要从命令行获取 args 一直到脚本块,您需要从 Invoke-Command -ArgumentList $args 重新传递它们。

    【讨论】:

      【解决方案2】:

      您需要将参数传递给脚本块:

      Invoke-Command  -ScriptBlock $script -ArgumentList $args 
      

      【讨论】:

        【解决方案3】:

        您也可以显式声明命名参数。例如:

        param([switch]$someBoolSwitch=$false, [String]$nameOfSomething="some default string")

        这允许您将命名参数传递给脚本,如下例所示:

        .\<nameOfScript.ps1> -someBoolSwitch -nameOfSomething "Slayer Roolz!"

        如果您省略了-nameOfSomething "Slayer Roolz!",那么$nameOfSomething 将默认为"some default sting"。同样,$someBoolSwitch 默认为 $false,除非另有定义。

        此方法的好处是让您作为开发人员可以决定哪些参数是必需的,哪些可以省略或默认。此外,它允许用户以他们喜欢的任何顺序输入参数,因为它们是命名的而不是位置的。

        与位置参数相比,使用命名参数的一个缺点是命令行调用可能会变得非常大,因为用户必须输入每个参数名称。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-25
          • 2020-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-24
          • 2018-04-07
          相关资源
          最近更新 更多