【備忘録】ちょっとしたメモ書き【備忘録】

自分でやったこと調べてみた事とのメモ書きブログです
主に周辺機器の翻訳した取り説や故障修理の手順を記録しています。

logとり楽したい。

2023年07月02日 | Windows PowerShell

#動作の概要:
#実行時に ips.txt ファイルからサーバーのリストと各サーバーに対応するマクロのパスを取得します。
#各サーバーに対してpingを実行し、応答速度に基づいてマクロの実行を判断します。
#マクロを実行した場合は、ログファイルに実行したことと実行日時を記録します。実行しなかった場合やping応答がなかった場合もログに記録されます。
#動作環境:
#
#PowerShell 5.0 以降が必要です。
#Windows オペレーティングシステム上で動作します。
#ルールの設定:
#
#サーバーの一覧と各サーバーに対応するマクロのパスは、ips.txt ファイルに記述します。
#ips.txt ファイルの各行は、IPアドレス、サーバー名、マクロのパスをスペースで区切って記述します。
#例: 192.168.0.1 ServerA C:\Path\to\MacroA.exe
#マクロは指定の条件を満たす場合に実行されます。
#マクロの実行条件: サーバーのping応答速度が200ms以下の場合に実行されます。
#マクロの実行結果やping応答の有無により、ログファイルに実行結果が記録されます。
#ログファイルは log.txt として指定のパスに作成されます。
#各ログエントリーには、実行日時と実行したサーバーの情報が含まれます。
#使用方法:
#
#ips.txt ファイルにサーバーの一覧と各サーバーに対応するマクロのパスを記述します。
#PowerShell 5.0 以上の環境で、スクリプトを実行します。
#スクリプトがサーバーにpingを実行し、条件を満たす場合は指定のマクロが実行され、ログファイルに実行結果が記録されます。
#注意:
#
#スクリプトを実行する前に ips.txt ファイルを正しく設定してください。
#マクロの実行に関連するセキュリティ上のリスクに十分注意してください。
#

$ipListFilePath = "C:\Path\to\ips.txt"  # IPアドレスとサーバー名、マクロパスが記述されたファイルのパス

# IPリストファイルの存在を検証
if (-not (Test-Path -Path $ipListFilePath)) {
    Write-Host "Error: IP list file not found at '$ipListFilePath'"
    exit 1
}

# IPリストファイルの読み込み
$ipList = Get-Content -Path $ipListFilePath

$logFilePath = "C:\Path\to\log.txt"               # ログファイルのパス

Clear-Content -Path $logFilePath

$serverMap = @{}
$macroMap = @{}
foreach ($line in $ipList) {
    $ip, $server, $macroPath = $line -split '\s+', 3
    $serverMap[$ip] = $server
    $macroMap[$ip] = $macroPath
}

foreach ($ip in $serverMap.Keys) {
    $pingResult = Test-Connection -ComputerName $ip -Count 1 -ErrorAction SilentlyContinue
    if ($pingResult) {
        $responseTime = $pingResult.ResponseTime

        if ($responseTime -le 200) {
            $macroPath = $macroMap[$ip]
            if (-not (Test-Path -Path $macroPath)) {
                Write-Host "Error: Macro file not found at '$macroPath' for $ip"
                continue
            }

            # マクロを実行
            Write-Host "Executing macro on $ip ($($serverMap[$ip]))"
            Start-Process -FilePath $macroPath -ArgumentList $ip -NoNewWindow -Wait

            # 実行日時を取得
            $executionTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

            # ログに実行したことと実行日時を記録
            $logEntry = "[$executionTime] Executed macro on $ip ($($serverMap[$ip]))"
            Add-Content -Path $logFilePath -Value $logEntry
        } else {
            # ログに実行しなかったことを記録
            $logEntry = "[$executionTime] Skipped macro execution on $ip ($($serverMap[$ip]))"
            Add-Content -Path $logFilePath -Value $logEntry
        }
    } else {
        # ログにping応答がなかったことを記録
        $logEntry = "[$executionTime] No ping response from $ip ($($serverMap[$ip]))"
        Add-Content -Path $logFilePath -Value $logEntry
    }
}

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PowerShellでログファイルから特定の文字を検知したらなにかしてみる

2023年06月07日 | Windows PowerShell

# ログファイルのパス
$logFilePath = "C:\path\to\logfile.txt"

# 検出するキーワードと処理のマッピング
$keywords = @{
    "キーワード1" = {
        # キーワード1が検出された場合の処理
        Write-Host "キーワード1がログファイル内で見つかりました。"
        # ここにキーワード1が検出された時の処理を追加する
    }
    "キーワード2" = {
        # キーワード2が検出された場合の処理
        Write-Host "キーワード2がログファイル内で見つかりました。"
        # ここにキーワード2が検出された時の処理を追加する
    }
    # 追加のキーワードと処理をここに追加する
}

# ログファイルを読み込み、キーワードの検出と対応する処理の実行
$logContent = Get-Content -Path $logFilePath -Raw
foreach ($keyword in $keywords.Keys) {
    if ($logContent -match $keyword) {
        & $keywords[$keyword]
    }
}

【解説】

$keywordsという連想配列を使用して、キーワードとそれに対応する処理をマッピングしています。キーワードと処理の組み合わせは$keywords変数に追加できます。

キーワードがログファイル内で検出されると、対応する処理が実行されます。各キーワードの処理は、# ここにキーワードXが検出された時の処理を追加するのコメントの下に追加してください。

複数のキーワードを追加する場合は、$keywords変数に追加のキーワードと処理を追加してください。キーワードと処理は連想配列の形式で追加

※忘備録、使うときは自己責任

参考文献

Windows PowerShell逆引きハンドブック | 蒲生睦男 | 工学 | Kindleストア | Amazon

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PowerShellで特定のIPの死活監視をする

2023年05月29日 | Windows PowerShell

簡単ですがコードはこんな感じです。

$hostAD = Read-Host "監視するホストのIPアドレスを入力してください,
終了させるにはQボタンを押してください"
$ping = New-Object System.Net.NetworkInformation.Ping
$timeout = 1000
while ($true) {
  $result = $ping.Send($hostAD, $timeout)
  if ($result.Status -eq "Success") {
    Write-Host "Ping succeeded"
  } else {
    Write-Host "Ping failed"
  }
  if ([System.Console]::KeyAvailable) {
    $key = [System.Console]::ReadKey($true)
    if ($key.Key -eq "Q") {
      break
    }
  }
  Start-Sleep -Seconds 6
}

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする