PowerShellで関数を作ろう

Powershellで関数を作れと指示があった。
関数の中身は、ある文字列の存在の有無を検索し、結果によって出力メッセージを変えろ、的なもの。
そしてその関数は、別なファイルから呼び出せるようにすること。
以下は関数用ファイルの中身。超適当だが、Pingの実行結果から文字列を検索しようとしている。

function grep ($word){
ping localhost | Select-String -Pattern $word
}

以下は呼び出し用ファイルの中身。

. ".\\pingrep.ps1"

$result = grep "ラウンド トリップの概算時間"

if($result -eq $null) {
Write-Host "Ping NG"
} else {
Write-Host "Ping OK"
}

pingの結果から「ラウンド トリップの概算時間」という文字列が含まれているかどうかを検索し、なければ(=Pingでミスっていれば)「Ping NG」という文言を表示し、あれば(=Pingの反応が正常に返ってくれば)「Ping OK」という文言を表示させるというもの。

これは割と簡単に解決できた…が、今度は「検索して出てきた文字列が何番目に位置するか」が欲しいとのこと。
今回の例を再利用し、この中で「概算」という文字が何番目にあるかを返してもらおうとしましたが、できませんでした。

文字列の位置を返すのにはIndexOfメソッドが有効みたいですが、このIndexOfメソッドは、配列に対してしか上手く機能しないっぽい?今回私がやろうとしているような、「変数の中身の何文字目にあるか」を調べてくれることはできないようだ。

変数の中身はダメだとして、ファイルに該当した文章を一時的に出力させて、それを検索させて返してもらおうとしたが、これもダメだった。

$result = @(Get-Content C:\tmp\grepfile.txt)
$result.IndexOf('pen')
 -1
※-1=存在しない、ということ

中身はこんなん(超適当)
 Is this a pen?
 No, It is an apple.
配列を定義すれば、ちゃんと返してくれるのだが、コマンドの実行結果を無理矢理配列化するのはダメだったか。

$list = @('pen','apple','book','bike')
$list.IndexOf('pen')
0

ここまでやっといて何だけど、関数の概念が全く理解できていない。