Loïc MICHEL 的回答是正确的,但是如果您发现很难记住哪个位置参数是 中的哪个ScriptBlock
,我想提供一个使用param
关键字的技巧。在 , 中ScriptBlock
,以您对高级函数的方式开始正文param
,并将您的代码也放在后面,就好像它是一个函数一样:
注意:名称ScriptBlock
param
在当前会话中不需要相同ScriptBlock
,可以相同或完全不同。重要的是您在-ArgumentList
.
Start-Job { param( $mysqlpath ) & "$mysqlpath\mysqld.exe" } -ArgumentList $mysqlpath
这是有效的,因为 aScriptBlock
只是一个未命名的函数,因此您可以以与定义适当函数时几乎相同的方式定义参数。in中的参数按提供的顺序-ArgumentList
传递给ScriptBlock
作为位置参数,因此默认情况下,参数传递的顺序与它们绑定到命名参数 in 的顺序相同。
虽然$using:
范围在语法上更易于使用,但这种方法可以让您在这里获得最好的结果,因为$using:
范围不能在当前会话中使用。这是非常有用的ScriptBlock
,您需要能够在任何上下文中执行,并且它足够复杂以至于通过索引引用参数变得难以管理。这种方法允许您命名参数并ScriptBlock
在所有执行上下文中使用任何参数,无论是Start-Job
、Invoke-Command
、还是使用调用运算符powershell.exe
执行 a 。ScriptBlock
&
$args[i]
如果您想使用命名变量而不是引用每个变量,这是(如果不是)最可移植的解决方案之一。