簡単なps1ファイルを書く ファイルの中身を検索

おはようございます。すぎやまです。

この記事では、ps1ファイルを使用してファイルの中身を検索する方法を紹介します。

まず、結論を記載します。

ps1ファイルでファイルの中身検索

  • ファイルの内容検索は「-match」コマンドを使用
  • 検索したい内容を指定→ファイルの中身読み出し→ifとmatchを使って確認

下記、詳細を説明します。

使用するコマンド

前述の通り、「-match」コマンドを使用します。

文法機能
[文字列A] -match [文字列B][文字列A]に[文字列B]が含まれる場合にtrueを返す

詳細はこちらのサイトをご覧ください。

テスト用コード

先ほどのサイト内にあるコードを紹介します。
下記のコードのようにmatchは機能します。

# Partial match test, showing how differently -match and -like behave
"PowerShell" -match 'shell'        # Output: True
"PowerShell" -like  'shell'        # Output: False

# Regex syntax test
"PowerShell" -match    '^Power\w+' # Output: True
'bag'        -notmatch 'b[iou]g'   # Output: True

Wordの中身を検索

matchを活用することによって、Wordの中身を検索できます。

# COMオブジェクトを作成してWordを起動
$word = New-Object -ComObject Word.Application
$word.Visible = $false  # Wordウィンドウを非表示にする

# スクリプトファイルのディレクトリをカレントディレクトリに設定する
Set-Location -Path $PSScriptRoot

# 検索する単語の入力
$keyword = Read-Host "検索する単語を入力してください"

# Wordファイル内のテキストを検索する
$files = Get-ChildItem -Path $PSScriptRoot -Filter *.docx
foreach ($file in $files) {
    $document = $word.Documents.Open($file.FullName)
    foreach ($paragraph in $document.Paragraphs) {
        $text = $paragraph.Range.Text
        if ($text -match $keyword) {
            Write-Host "File: $($file.FullName)"
            Write-Host "--------------------------"
        }
    }
    $document.Close()
}

# Wordアプリケーションを終了
$word.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
Remove-Variable word

Write-Host "検索が完了しました。"

こちらのコードでは、
検索ワードを入力→Wordを開く→各段落を検索→検索ワードがあったら情報取得
という処理をしています。

使用方法はこちらの記事をご覧ください。

Excelの中身を検索

先ほど同様の処理によって、Excelの中身を検索できます。

# COMオブジェクトを作成してExcelを起動
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false  # Excelウィンドウを非表示にする

# スクリプトファイルのディレクトリをカレントディレクトリに設定する
Set-Location -Path $PSScriptRoot

# 検索する単語の入力
$keyword = Read-Host "検索する単語を入力してください"

# 現在のディレクトリ内のExcelファイルを検索する
$files = Get-ChildItem -Path $PSScriptRoot -Filter *.xlsx
foreach ($file in $files) {
    $workbook = $excel.Workbooks.Open($file.FullName)
    foreach ($worksheet in $workbook.Worksheets) {
        $rows = $worksheet.UsedRange.Rows.Count
        $cols = $worksheet.UsedRange.Columns.Count
        for ($i = 1; $i -le $rows; $i++) {
            for ($j = 1; $j -le $cols; $j++) {
                $cell = $worksheet.Cells.Item($i, $j)
                $cellText = $cell.Text
                if ($cellText -match $keyword) {
                    Write-Host "File: $($file.FullName)"
                    Write-Host "Cell: $cellText"
                    Write-Host "--------------------------"
                }
            }
        }
    }
    $workbook.Close()
}

# Excelアプリケーションを終了
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
Remove-Variable excel

Write-Host "検索が完了しました。"

こちらのコードでは、
検索ワードを入力→Wordを開く→各段落を検索→検索ワードがあったら情報取得
という処理をしています。

使用方法はこちらの記事をご覧ください。

その他のps1ファイル

今回はリネームに焦点を当てましたが、
ps1ファイルを使用するとその他にも様々な処理も行うことができます。

ps1ファイルに可能なことを大まかに知りたい方はこちらの記事を、
実際に使用できるコードを知りたい方はこちらの記事を参照ください。

以上、最後まで読んでくださりありがとうございました。

タイトルとURLをコピーしました