雑記+備忘録

OS中心の技術情報と趣味について(最近は主に将棋)。備忘録なのでここに書かれたことを試すのは自己責任でお願いします。

PowerShellの関数(ファンクション)の考え方

(参考としてリンクさせていただいたURLの筆者の皆様ありがとうございます)

別ファイルに分けて関数化する方法
→ファイルを作って、「. “C:\fso\include.ps1"」のように「ドット、スペース、フルパス」で呼び出し元ファイルに記載(これを「スクリプトをドット ソース形式で使用」という)

以下を参考にしました。(いつものScripting Guy)
https://gallery.technet.microsoft.com/scriptcenter/b590021a-b311-47f9-8f48-3809658b7cbf

ところが、「戻り値はどうやって指定するんだろ」と疑問を持った途端に、
PowerShellの仕様の壁(基本らしい)にぶち当たりました。
「関数内で値が出力されると、returnキーワードがついてなくてもすべて呼び出し元に出力される」ということで、
作成したファンクション内の値出力が全て返ってきます。
(参考)
http://stknohg.hatenablog.jp/entry/2015/07/05/114903
http://winscript.jp/powershell/253

いや、純粋に計算結果で出た一つの値だけを返したいんだけど、と探した結果、以下のサイトにとても分かりやすく書いてありました。
http://tyru.hatenablog.com/entry/2015/11/08/004204

で、以下のサンプルソースを作ってみました。

Moto.ps1

# 引数1:文字列

# ファイルのパスを情報取得
$scriptPath = $MyInvocation.MyCommand.Path
$nofilePath = Split-Path -Parent $scriptPath

# Function取り込み
. ($nofilePath + "\Include.ps1")

# Functionにより値変換
$pTaro = fncAddTaro($args[0])

echo $pTaro



Include.ps1

# ファンクション
# 文字列が「ピコ」を含めば「ピコ太郎」を返す
# 文字列に「ウルトラ」を含めば「ウルトラマンタロウ」を返す
# それ以外は「たろー」を付加して返す
Function fncAddTaro($strMoji) {

  $rtnVal = ""
  .{
     if ($strMoji.Contains("ピコ")) {
       $rtnVal = "ピコ太郎"
       return # ここで「.{ }」ブロックを抜ける
     }

     if ($strMoji.Contains("ウルトラ")) {
       $rtnVal = "ウルトラマンタロウ"
       return
     }

   $rtnVal = $strMoji + "たろー"
   return
   } | Out-Null  # 「.{ }」ブロックの中の出力は戻り値に含めない

return $rtnVal

}



実行結果

PS > .\Moto.ps1 "パピコ"
ピコ太郎
PS > .\Moto.ps1 "ウルトラクイズ"
ウルトラマンタロウ
PS > .\Moto.ps1 "ワルトラ"
ワルトラたろー
PS > .\Moto.ps1 "山下"
山下たろー