我想设置一个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命令中似乎没有扩展?我一定是遗漏了某种作用域规则。有人能给点建议吗?谢谢!
发布于 2013-02-03 02:21:17
您必须使用get-help start-job中的-argumentlist参数:
start-job -ScriptBlock { & $args[0] } -ArgumentList @($mysqlpath )请注意,在V3中,您只需在变量名前使用前缀using::
Start-Job -ScriptBlock { & "$using:mysqlpath\mysqld.exe" }发布于 2021-08-31 17:15:26
Loïc MICHEL's answer是正确的,但是如果您发现在ScriptBlock中很难记住哪个位置参数是哪个位置参数,我想提供一个使用param关键字的技巧。在ScriptBlock中,主体以param开头,就像处理高级函数一样,并将代码放在后面,就像它是一个函数一样:
注意:
ScriptBlockparam名称在ScriptBlock和当前会话中不必相同,它可以是相同的,也可以是完全不同的。重要的是在-ArgumentList中匹配正确的参数。
Start-Job { param( $mysqlpath ) & "$mysqlpath\mysqld.exe" } -ArgumentList $mysqlpath这是因为ScriptBlock只是一个未命名的函数,所以您可以使用与定义适当函数时基本相同的方式来定义参数。-ArgumentList中的参数按照提供的顺序作为位置参数传递给ScriptBlock,因此默认情况下,传递参数的顺序与将参数绑定到命名参数的顺序相同。
虽然$using:作用域在语法上更容易使用,但这种方法在这里得到了最好的效果,因为$using:作用域不能在当前会话中使用。这是非常有用的,你有一个需要能够在任何上下文中执行的ScriptBlock,而且它足够复杂,以至于通过索引引用参数变得难以管理。这种方法允许您命名参数,并在所有执行上下文中使用任何ScriptBlock,无论是Start-Job、Invoke-Command、powershell.exe,还是使用调用操作符&执行ScriptBlock。
如果您想使用命名变量而不是为每个变量引用$args[i],这是最可移植的解决方案之一(如果不是)。
https://stackoverflow.com/questions/14664764
复制相似问题