这是我的代码:
$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
我遗失了什么?
由于
答案 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
,除非另有定义。
此方法的好处是允许您作为开发人员决定哪些参数是必需的,哪些参数可以省略或默认。此外,它允许用户以他们喜欢的任何顺序输入参数,因为它们是命名而非位置。
命名参数而非位置参数的一个缺点是命令行调用可能变得非常大,因为用户必须输入每个参数名称。