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 "山下" 山下たろー