powershell传递命令行参数

时间:2012-02-07 22:41:17

标签: windows powershell powershell-v2.0

这是我的代码:

$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

我遗失了什么?

由于

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

您需要将参数传递给scriptblock:

Invoke-Command  -ScriptBlock $script -ArgumentList $args 

答案 2 :(得分:0)

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

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

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

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

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

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

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