6

mysqlを開始および停止するコマンドレットを設定したいのですが、Start-Jobを使用して設定しようとしています。Powershellプロファイルに次のものがあります。

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

しかし、変数はジョブコマンドで展開されていないようです?ある種のスコープルールが欠けているに違いありません。誰かアドバイスしてもらえますか?ありがとう!

4

2 に答える 2

11

-argumentlistパラメータを使用する必要があります。get-helpstart-jobを参照してください。

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

using:V3では、 varnameexの前にプレフィックスを使用する必要があることに注意してください。

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

LoïcMICHELの答えは正解ですが、内のどの位置引数がどれであるかを思い出すのが難しくなった場合は、キーワードScriptBlockを使用してトリックを提供したいと思います。param内で、高度な関数の場合と同じようScriptBlockに本文を開始し、param関数のようにコードを後に配置します。

注:ScriptBlock param名前は、現在のセッションで同じである必要はありません。同じでも、まったくScriptBlock異なるものでもかまいません。重要なことは、正しい引数を。の位置に一致させることです-ArgumentList

Start-Job { param( $mysqlpath ) & "$mysqlpath\mysqld.exe" } -ArgumentList $mysqlpath

これは、aScriptBlockが名前のない関数であるために機能します。したがって、適切な関数を定義する場合とほぼ同じ方法でパラメーターを定義できます。の引数は、指定された順序で位置引数として-ArgumentList渡さScriptBlockれます。したがって、デフォルトでは、引数が渡される順序は、の名前付きパラメーターにバインドされる順序と同じです。

スコープは構文的に操作が簡単ですが、現在のセッションではスコープを使用できないため$using:、この方法では、ここですべての世界で最高のものを入手できます。これは、任意のコンテキストで実行できる必要$using:がある非常に便利であり、インデックスによる引数の参照の管理が困難になるほど複雑です。このアプローチでは、パラメーターに名前を付けることができ、、、、、または呼び出し演算子を使用してを実行するかどうかに関係なく、すべての実行コンテキストで任意のパラメーターを操作できます。ScriptBlockScriptBlockStart-JobInvoke-Commandpowershell.exeScriptBlock&

$args[i]これは、すべての変数を参照する代わりに名前付き変数を使用する場合の(そうでない場合でも)最も移植性の高いソリューションの1つです。

于 2021-08-31T17:15:25.930 に答える