Make the Most of IT.

お酒と映画が好きなJava屋さんがRubyとか学んだこと感じたことをつらつらと

【PowerShell】ForEach-Objectの要素をInvoke-Commandの引数へ同じ値を複数回指定する方法

はじめに

みなさんこんにちは。
ブログに書きたいことが溜まってきて嬉しいやら悲しいやらです。
その中でも今日かなりハマった、PowerShellInvoke-Commandで同じ単語を何度も渡したい時やり方について残しておこうと思います。
何事も鮮度って大事。

先に結論を書いておくと、↓のようにしたら大丈夫です。

$array = @("hoge","huga")

$array | ForEach-Object -Process{
  Invoke-Command TergetServer -ScriptBlock {    c:\Test\$args\$args.ps1} -ArgumentList $_
}

やりたかったこと

お仕事中に自動化ツールを作ることに。
その中でPowerShellでいくつかのフォルダ内に入っているフォルダ名と同名のファイルを実行することになりまして。
ForEach-Objectでぐるぐるしている間にInvoke-Commandへ各要素を引数として渡せばいいんでしょう?ということGoogle先生にご教示いただいて↓のように書きました。

$array = @("hoge","huga")

$array | ForEach-Object -Process{
  Invoke-Command TergetServer -ScriptBlock {    c:\Test\$args[0]\$args[0].ps1} -ArgumentList $_

Invoke-Commandに引数を渡すときは配列になるんだよね!ってことで意気揚々と実行するとエラーが。。。

エラー内容は「c:\Test\hoge\hoge[0].ps1は見つかりません。」

解決策

ん?最初の引数はうまく「hoge」になってるのに2個目の引数に「[0]」が残っちゃってるよ?

てことで残ってるなら取っちゃえばいいじゃんの精神で↓のように修正。

$array = @("hoge","huga")

$array | ForEach-Object -Process{
  Invoke-Command TergetServer -ScriptBlock {    c:\Test\$args\$args.ps1} -ArgumentList $_
}

無事hoge、hugaのスクリプトを実行することができました!

終わりに

ということで、今日ハマったPowerShellでForEach-Objectぐるぐる中にInvoke-Commandへ要素を引数として何度も渡す方法について書いて見ました。

先輩に大見得切って「これぐらいの自動化ツールなら今日中にできますよ!楽勝ですよ!」っていっちゃってハマっちゃったもんだからかなり焦りました。。。

あまり触ったことないもので大見得切ってはいけません。
そう胸に刻み付ける僕でした。