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]如果您想使用命名变量而不是引用每个变量,这是(如果不是)最可移植的解决方案之一。