お問い合わせ
ChatGPTでフォルダ監視に関するpowershellを作ってもらった
投稿日:2023-08-29
@prompta
(株)ブロックセブンスソフトウェア
powerShell
ChatGPT
監視

# 概要

windowsでフォルダ監視を行う際にpoworShellが使えるのではと思い。
chatGPTに作ってもらいました。
今回は日本語で質問してみました。

# 質問内容

powershell でフォルダを監視し、ファイルが存在する場合は以下のURLにファイルを送信して下さい。
https://aaaa/api/v1/files/upload
もしレスポンスステータスが200以外で返却された場合はerrorフォルダを作成して、そのフォルダにファイルを移動し、レスポンスステータスが200で返却された場合はsuccessフォルダを作成して保存します。

# 回答

もちろんです。以下は、PowerShellスクリプトを使用してフォルダを監視し、指定されたURLにファイルを送信し、レスポンスに応じてファイルを移動する手順です。

# 監視対象のフォルダとURLを指定
$sourceFolder = "C:\Path\To\Source\Folder"
$errorFolder = "C:\Path\To\Error\Folder"
$successFolder = "C:\Path\To\Success\Folder"
$uploadUrl = "https://aaaa/api/v1/files/upload"

# フォルダの監視を開始
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $sourceFolder
$watcher.Filter = "*.*"  # 必要に応じてフィルターを調整
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true

# ファイルが作成されたときのイベントハンドラ
$onCreated = Register-ObjectEvent $watcher "Created" -Action {
    $filePath = $Event.SourceEventArgs.FullPath

    # ファイルをURLに送信
    $response = Invoke-RestMethod -Uri $uploadUrl -Method Post -InFile $filePath

    if ($response.StatusCode -eq 200) {
        # 成功フォルダにファイルを移動
        Move-Item -Path $filePath -Destination $successFolder
    } else {
        # エラーフォルダを作成し、ファイルを移動
        New-Item -Path $errorFolder -ItemType Directory -Force
        Move-Item -Path $filePath -Destination $errorFolder
    }
}

# スクリプトを実行し続ける
try {
    while ($true) {
        Start-Sleep -Seconds 60
    }
} finally {
    Unregister-Event -SourceIdentifier $onCreated.Name
    $watcher.Dispose()
}

これは基本的な例ですので、具体的な要件に合わせて調整する必要があります。エラーハンドリング、ログ記録、失敗したアップロードのリトライなどを追加することも検討してください。また、フォルダへの読み取り/書き込み権限があることを確認してください。

# 所感&追記

もちろんですという力強い返答とともにあった言う間に完成です。
このままのこのコードが使えるわけではないとは思いますが、powerShellについては全く知見が無いの状態で、
ひな形として、とっかかりにはなりますね。

  • 日本語が含まれる場合文字コードはshiftJISにしないとエラーになりますねここはご注意です。

# 追加でログ記録について追加でスクリプトを書いてもらいました。

もし失敗した場合はログ記録を行ってください、内容はファイル名ステータス情報をerror.txtに追記して下さい

# 追加の返答

もちろんです。以下は、スクリプトに失敗時のログ記録を追加したバージョンです。エラーが発生した場合、error.txt ファイルにファイル名とレスポンスのステータス情報を追記します。

# 監視対象のフォルダとURLを指定
$sourceFolder = "C:\Path\To\Source\Folder"
$errorFolder = "C:\Path\To\Error\Folder"
$successFolder = "C:\Path\To\Success\Folder"
$uploadUrl = "https://api.escuelajs.co/api/v1/files/upload"

# ログファイルのパス
$logFilePath = "C:\Path\To\Error\Folder\error.txt"

# フォルダの監視を開始
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $sourceFolder
$watcher.Filter = "*.*"  # 必要に応じてフィルターを調整
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true

# ファイルが作成されたときのイベントハンドラ
$onCreated = Register-ObjectEvent $watcher "Created" -Action {
    $filePath = $Event.SourceEventArgs.FullPath

    # ファイルをURLに送信
    $response = Invoke-RestMethod -Uri $uploadUrl -Method Post -InFile $filePath

    if ($response.StatusCode -eq 200) {
        # 成功フォルダにファイルを移動
        Move-Item -Path $filePath -Destination $successFolder
    } else {
        # エラーフォルダを作成し、ファイルを移動
        New-Item -Path $errorFolder -ItemType Directory -Force
        Move-Item -Path $filePath -Destination $errorFolder

        # エラーログを記録
        $logMessage = "$(Get-Date) - File '$filePath' upload failed. Status code: $($response.StatusCode)`r`n"
        Add-Content -Path $logFilePath -Value $logMessage
    }
}

# スクリプトを実行し続ける
try {
    while ($true) {
        Start-Sleep -Seconds 60
    }
} finally {
    Unregister-Event -SourceIdentifier $onCreated.Name
    $watcher.Dispose()
}

このスクリプトは、エラーが発生した場合にエラーログを error.txt ファイルに追記します。エラーログにはファイル名とレスポンスのステータスコードが記録されます。ログファイルのパスを適切に指定してください。