朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
PowerShell grepもどきのスクリプト





PowerShellでgrepもどきのスクリプトを作ってみました。
オプションの-rで再帰検索をするかどうか指定できます。
-SimpleMatchで-filterで指定したものが正規表現ではなく、ただのテキストマッチであるかどうか
-filterにスペースを空けて値を指定するとファイル内の文字列の検索指定ができます。
-includeにスペースを空けて値を指定すると検索するファイル名を指定できます。
-excludeにスペースを空けて値を指定すると検索に含めないファイル名を指定できます。

-filterを使った場合は、ファイルの削除はできません。

使い方の例

#以下のフォルダにある全アイテムを検索します。
grep -r -no
#aから始まるファイルやフォルダをサブフォルダも含めて検索します。
grep -r -no -in a*
#ファイル名が*.txtにマッチし、backup*にマッチしなくて、abcの文字列を含む行をカレントフォルダのみ検索します。
grep -f abc -i *.txt -e backup*
#c:\tempフォルダ以下で、ファイル名が*.ps1にマッチしなくて、abc*の文字列を含む行を再帰的にサブフォルダも検索します。
grep -r -f abc* -e *.ps1 -s -path c:\temp\*
#ファイル名が*.txtにマッチし、数字3文字にマッチするように検索します。
grep -r -f "`\d{3,3}" -in *.txt

grep.ps1

#$r:オプションの-rで再帰検索が指定できる
#$nofilter:このスイッチが指定されると$filterは無視される。ファイル名だけでの検索になる。
#$SimpleMatch:$filterで指定されたものをただのテキスト検索とするかどうか
#$filter:検索文字列(正規表現)
#$include:ファイル名の指定
#$exclude:ファイル名で除外するもの
#$path:検索する対象のパス(省略時はカレントディレクトリになります)
#-Encodingでdefaultを指定すると、日本語OSではシフトJISになります。
param([switch] $r, [switch] $nofilter, [switch] $SimpleMatch, $filter, $include, $exclude, $path)
#ファイル名が.\xxx.txtという感じで.\がついていた時のための処理
if($include -ne $null)
{
	if($include.StartsWith(".\"))
	{
		$include = $include.Remove(0,2)
	}
}
#ファイル名が.\xxx.txtという感じで.\がついていた時のための処理
if($exclude -ne $null)
{
	if($exclude.StartsWith(".\"))
	{
		$exclude = $exclude.Remove(0,2)
	}
}
#パスが指定されない時の処理
if($path -eq $null)
{
	$path = "*"
}
"include"
$include
if($r -eq $false -and $nofilter -eq $false -and $SimpleMatch -eq $false){
	$result = Get-ChildItem -Path $path -Include $include -Exclude $exclude | Select-String -Pattern $filter -Encoding "default"
}elseif($r -eq $true -and $nofilter -eq $false -and $SimpleMatch -eq $false){
	$result = Get-ChildItem -Path $path -Include $include -Exclude $exclude -Recurse -Force | Select-String -Pattern $filter -Encoding "default"
}elseif($r -eq $false -and $nofilter -eq $false -and $SimpleMatch -eq $true){
	$result = Get-ChildItem -Path $path -Include $include -Exclude $exclude | Select-String -Pattern $filter -Encoding "default" -SimpleMatch
}elseif($r -eq $true -and $nofilter -eq $false -and $SimpleMatch -eq $true){
	$result = Get-ChildItem -Path $path -Include $include -Exclude $exclude -Recurse -Force | Select-String -Pattern $filter -Encoding "default" -SimpleMatch
}elseif($r -eq $false -and $nofilter -eq $true){
	$result = Get-ChildItem -Path $path -Include $include -Exclude $exclude
}elseif($r -eq $true -and $nofilter -eq $true){
	$result = Get-ChildItem -Path $path -Include $include -Exclude $exclude -Recurse -Force
}
#結果の表示
$result
#ヒット数の表示
if($result -eq $null){
	#0件の場合
	$count = 0
}elseif($result.gettype().fullname.toupper() -eq "SYSTEM.OBJECT[]"){
	#2件以上の場合
	$count = $result.length
}else{
	#1件の場合
	$count = 1
}
"`nCount`n---------`n" + $count
#0件の場合は後の処理は必要ない
if($count -eq 0){
	return
}
if($nofilter -eq $true){
	"削除しますか?(y/n)"
	$ans = Read-Host
	if($ans.ToLower() -eq "y"){
		#削除する
		$result | Foreach-Object{ Remove-Item $_ }
	}
}








良いやや良い普通やや悪い悪い
0 0 1 0 0

投稿日時評価コメント