【问题标题】: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,除非另有定义。
此方法的好处是让您作为开发人员可以决定哪些参数是必需的,哪些可以省略或默认。此外,它允许用户以他们喜欢的任何顺序输入参数,因为它们是命名的而不是位置的。
与位置参数相比,使用命名参数的一个缺点是命令行调用可能会变得非常大,因为用户必须输入每个参数名称。