# 概要
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 ファイルに追記します。エラーログにはファイル名とレスポンスのステータスコードが記録されます。ログファイルのパスを適切に指定してください。