6

我想设置一个 cmdlet 来启动和停止 mysql,我正在尝试使用 Start-Job 来实现。我的 Powershell 配置文件中有以下内容:

$mysqlpath = "C:\Program Files\MySQL\MySQL Server 5.5\bin"
Function Start-Mysql
{
    Start-Job -ScriptBlock { & "$mysqlpath\mysqld.exe" }
}

但是,该变量似乎没有在 job 命令中扩展?我一定错过了某种范围规则。有人可以建议吗?谢谢!

4

2 回答 2

11

你必须使用-argumentlist参数见get-help start-job

 start-job  -ScriptBlock { & $args[0] } -ArgumentList @($mysqlpath )

请注意,在 V3 中,您只需using:在 varname ex 之前使用前缀:

  Start-Job -ScriptBlock { & "$using:mysqlpath\mysqld.exe" }
于 2013-02-02T18:21:17.407 回答
1

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-JobInvoke-Command、还是使用调用运算符powershell.exe执行 a 。ScriptBlock&

$args[i]如果您想使用命名变量而不是引用每个变量,这是(如果不是)最可移植的解决方案之一。

于 2021-08-31T17:15:25.930 回答