Help us understand the problem. What is going on with this article?

PowerShell| Start-Job の InitializationScript へ引数を複数渡す

More than 3 years have passed since last update.

今回の問題のソースは下記です。

期待通りに動作しないソース

$functions = {
  function Output-Message {
    param (
      [string]$message,
      [string]$name
    )
    sleep 5
    echo "$message : $name"
  }
}

$job = Start-Job -InitializationScript $functions -ScriptBlock {
  param (
    [string]$m,
    [string]$n
  )
  Output-Message $m, $n
} -ArgumentList "Hello World", "kirishima"

# 待機後に結果出力
Wait-Job $job
Write-Host (Receive-Job -Job $job)
Remove-Job $job

Start-Jobはグローバルスコープでも変数を渡せません。ですので、-ArgumentList で引数を渡します。

上記のスクリプトはHello World : kirishimaと出力されてほしいのですが、Hello World kirishima :と出力されます。どうやら、第1引数へ空白区切りで値が代入されているようです。第2引数へ渡す方法は調べた限りありませんでした。
(2017/3/28 追記)ありました、と言うか初心者がつまずく初歩的なミスでした。

解決編

引数を1つしか渡せないので、Hashtable として渡せば今回は問題を解決できそうです。修正版が下記になります。

$functions = {
  function Output-Message {
    param (
      [hashtable]$data                                 # 変更点1
    )
    sleep 5
    $output = $data["message"] + " : " + $data["name"] # 変更点2
    echo $output                                       # 変更点3
  }
}

$job = Start-Job -InitializationScript $functions -ScriptBlock {
  param (
    [string]$m,
    [string]$n
  )
  Output-Message @{message = $m; name = $n} # 変更点4
} -ArgumentList "Hello World", "kirishima"

# 待機後に結果出力
Wait-Job $job
Write-Host (Receive-Job -Job $job)
Remove-Job $job

後から気付きましたが、split で分割する方法もあります。ただ、HashTableで渡したほうが、変数的でわかりやすいので :o: です。

そもそもこちらが正解(2017/3/28 追加)

原因は、Output-Messageを呼び出す際にカンマ区切りで指定していたことでした。Shellであることを忘れてどこぞの言語と勘違いしてました:cry:

$functions = {
  function Output-Message {
    param (
      [string]$message,
      [string]$name
    )
    sleep 5
    echo "$message : $name"
  }
}

$job = Start-Job -InitializationScript $functions -ScriptBlock {
  param (
    [string]$m,
    [string]$n
  )
  Output-Message $m $n # 変更点
} -ArgumentList "Hello World", "kirishima"

# 待機後に結果出力
Wait-Job $job
Write-Host (Receive-Job -Job $job)
Remove-Job $job

参考

soruma
libertyfish
よりニッチに。よりユニークに。 IT市場はもちろん、ヘルスケア・医療・介護など次世代市場における企業や生活者のユーザビリティを向上させるサービス、ソフトウェアを開発しています。
https://www.libertyfish.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした