社内SEの徒然なる日記

PowerShellでファイルから文字検索チェック

■ grep

あるテキストファイルに指定した文字が存在するのかを確認したいのです。

手法として、Get-Contentコマンドレットでテキストファイルの内容を取得して、それをパイプラインでSelect-Stringコマンドレットに渡してやれば実現できそうです。

Select-Stringで使うオプションは、-SimpleMatch と -Quietです。Select-Stringは結構高機能なコマンドなのですが、今回はそこまで複雑な処理は不要です。

-SimpleMatch を付けることで単純な文字列検索になります(普通は正規表現とかになる)。-Quiet は、戻値をブール値に変えてくれます。一致すればTrue、なければFalseですね。

まぁ、-SimpleMatch は別に無理に使う事もないんですけどね。

■ 正常パターン

では、適当にシェルを作ってみます。

# 検索するファイルパスを設定
[System.String]$textLog = 'D:¥EXPDP.log'

# ファイル中に"正常"という文字があるか検索
$textChk = Get-Content $textLog | Select-String -SimpleMatch '正常' -quiet
Write-Host ('[' + $textChk + ']')

# 結果がTrueであれば正常メッセージを表示
if ($textChk -eq $True) {
Write-Host '見つけた!'
}


EXPDP.log の中身をこうします。

aaa
fだfd正常
維持


これで実行すると、こうなります。

[True]
見つけた!


ここまではOKだったのですが・・・

■ 異常パターン

今度は、文字が無ければ正常というチェックをしてみたのです。

# 検索するファイルパスを設定
[System.String]$textLog = 'D:¥EXPDP.log'

# ファイル中に"異常"という文字があるか検索
$textChk = Get-Content $textLog | Select-String -SimpleMatch '異常' -quiet
Write-Host ('[' + $textChk + ']')

# 結果がFalseであれば正常メッセージを表示
if ($textChk -eq $False) {
Write-Host '無いのでOK!'
}


ファイルの中身は変更しない(異常という文字は無い)ので、戻値がFalseになると思ったのですが、何やら変です。実行したところ、こうなりました。

[]


何故か戻値が空です。これでは、戻値がFalseなら〜という判定が機能しません。

しばらく考えていたのですが、どうしても分からなかったので、if文を「if ($textChk -ne $True) {」とTrueでなければ正常として対応しました。

■ 後書き

恐らく、PowerShellの変数とかコマンドの型の考え方を私が誤解していると思うのですが、どうも釈然としません。そもそもスクリプトっていうものに対する知見が少ないので、解決の取っ掛かりすらつかめません。どうしたものやら。

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---
スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する