2012-02-07 150 views
7

这里是我的代码:PowerShell中传递命令行参数

$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 

我错过了什么?

感谢

回答

7

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

4

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

Invoke-Command -ScriptBlock $script -ArgumentList $args 
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

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

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