function IsTextFile([string]$filePath) {
try {
if (-not(Test-Path "HKCR:\")) {
# HKCR登録
New-PSDrive `
-Name HKCR `
-PSProvider Registry `
-Root HKEY_CLASSES_ROOT | Out-Null
}
# 拡張子を取得
$extension = [System.IO.Path]::GetExtension($filePath)
# 拡張子がない場合は判定不能
if ([string]::IsNullOrEmpty($extension)) {
return $false
}
# よく使う拡張子のMIMEタイプをハードコード
$textExtensions = @{
".txt" = "text/txt"
".csv" = "text/csv"
".json" = "application/json"
".xml" = "application/xml"
# 必要に応じて追加
}
# ハードコードされたMIMEタイプがあればそれを使用
if ($textExtensions.ContainsKey($extension)) {
return $true
} else {
# レジストリからMIMEタイプを取得
$mimeType = (Get-ItemProperty -LiteralPath "HKCR:\$($extension)")."Content Type"
# MIMEタイプがテキスト系かどうかを判定
if ($mimeType -like "text/*") {
return $true
} else {
return $false
}
}
} catch {
# エラーが発生した場合は判定不能
return $false
}
}
IsTextFile("H:\ps1\ListAll-FileComment.py")
.ps1がFalseが返る。レジストリエディタで見るとContent Typeが見当たらない。ハードコードした方が実用的か?
PowerShellでテキストファイル内の文字検索を行うスクリプトを書こうと思い対象ファイルがテキストファイルか判定するルーチンを試してみました。
レジストリへのアクセスが上手く動作してくれず、
# HKCR登録
New-PSDrive `
とドライブを追加するというちょっと理解に苦しむコードを追加したところアクセス出来るようになりました。
ドライブも論理的な名前だとすると追加することもあるのでしょうが、大概登録済みのものを使うことが普通だと思うのですが…
文字検索するワンライナー(拡張子を.ps1で決め打ちし、”Get”という文字が含まれている行が返ります。)
gci -r -fi "*.ps1" |% {gc $_|sls "Get"|%{Write-Host "$($_.Path): 行番号 $($_.LineNumber), 内容: $($_.Line)"}}
決め打ちでも良い様な気がしてきました。
PowerShellのコマンドレットは長いし、エイリアスで短くすると見慣れなくて暗号の様に見える。
コメント