トップ回答者
POWERSHELL3.0でファイル監視出来ないでしょうか?

質問
-
いつもお世話になっています。
Windows Server 2012で特定の2つのフォルダにファイルが作成されたのを監視して、
別サーバに移動させるというようなことは出来ないでしょうか?
【 データファイル WIN2012 \\192.168.0.1\C$\TEMP 】
data_20131113101600_0001.txt
data_20131113101605_0002.txt
【 コントロールファイル WIN2012 \\192.168.0.1\C$\TEMP 】
ctrl_20131113101600.txt
【 移動先 WIN2008 \\192.168.0.2\C$\TEMP 】
ctrlの_以下の20131113101600が同じdata_20131113101600_0001.txt
をctrlファイルと共に移動させたいです。
TEMPフォルダには複数存在していて、タイムスタンプが同じものだけを移動できればと思います。
よろしくお願いいたします。
- 編集済み qoo_man 2013年11月13日 2:42
回答
-
こんにちは
ちょっと興味があったので、監視部分だけサンプルを作ってみました。
$fromPath = "F:\Desktop\wk\wk1" $toPath = "F:\Desktop\wk\wk2" $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = $fromPath Register-ObjectEvent -InputObject $watcher -SourceIdentifier mywatch -EventName Created -Action { Move-Item $EventArgs.FullPath $toPath } #Unregister-Event -SourceIdentifier mywatch
いくらかでも参考になれば幸いです。- 回答としてマーク qoo_man 2013年11月26日 8:04
-
こんにちは、
当方の環境では、自PCで実行し、FileServer1のフォルダーを監視してFileServer2のフォルダーへ移動する処理が以下のような感じでうまくいっています。
FileServer1のフォルダーへは適当な画像ファイル(jpg)をコピーして試しました。
ファイルのコピーはエクスプローラで行っています。
$fromPath = "\\FileServer1\FromFolder" $toPath = "\\FileServer2\ToFolder" $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = $fromPath Register-ObjectEvent -InputObject $watcher -SourceIdentifier mywatch -EventName Created -Action { Move-Item $EventArgs.FullPath $toPath } #Unregister-Event -SourceIdentifier mywatch
ファイルサーバーはどちらもWindowsServer2008R2、自PCはWindows8です。
- 回答としてマーク qoo_man 2013年11月26日 8:04
すべての返信
-
こんにちは
ちょっと興味があったので、監視部分だけサンプルを作ってみました。
$fromPath = "F:\Desktop\wk\wk1" $toPath = "F:\Desktop\wk\wk2" $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = $fromPath Register-ObjectEvent -InputObject $watcher -SourceIdentifier mywatch -EventName Created -Action { Move-Item $EventArgs.FullPath $toPath } #Unregister-Event -SourceIdentifier mywatch
いくらかでも参考になれば幸いです。- 回答としてマーク qoo_man 2013年11月26日 8:04
-
minminnana_prof 様
フォルダにファイルを置いてもtopath側に移動されませんでした。
結果表示は
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 mywatch NotStarted False ...のようになっていました。
もう一回実行すると
Register-ObjectEvent : イベントにサブスクライブできません。ソース ID が 'mywatch' のサブスクライバーは、既に存在しています。
発生場所 行:1 文字:21
+ Register-ObjectEvent <<<< -InputObject $watcher -SourceIdentifier mywatch -EventName Created -Action {
+ CategoryInfo : InvalidArgument: (System.IO.FileSystemWatcher:FileSystemWatcher) [Register-ObjectEvent]、ArgumentException
+ FullyQualifiedErrorId : SUBSCRIBER_EXISTS,Microsoft.PowerShell.Commands.RegisterObjectEventCommand
となりました。
やりたいことは、そのとおりなのでこれが動作すればいいのですが、何が問題なのか分からないです。
折角教えて頂いたのに、私の理解が足りずにご迷惑おかけします。
-
minminnana_prof 様
何度も申し訳ありません。
fromとtoのサーバーが違うのですが、それが原因になったりするでしょうか?
Move-Item $fromPath $toPath
としたときに
Move-Item : ソースとターゲット パスは同一のルートを持たなければなりません。[移動] 操作はボリューム間で行えません。
発生場所 行:1 文字:10というエラーが出てしまいました。
コードのそのままを抜き出して
Move-Item $EventArgs.FullPath $toPath としたときには
Move-Item : 引数が null であるため、パラメーター 'Path' にバインドできません。
となったので、move-itemの送り元は変更しました。
Frompathにファイル名を追記して
Move-Item -path $fromPath -destination $toPath
としたらファイルが移動されましたが、関係ありますか?
- 編集済み qoo_man 2013年11月14日 3:06
-
こんにちは、
当方の環境では、自PCで実行し、FileServer1のフォルダーを監視してFileServer2のフォルダーへ移動する処理が以下のような感じでうまくいっています。
FileServer1のフォルダーへは適当な画像ファイル(jpg)をコピーして試しました。
ファイルのコピーはエクスプローラで行っています。
$fromPath = "\\FileServer1\FromFolder" $toPath = "\\FileServer2\ToFolder" $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = $fromPath Register-ObjectEvent -InputObject $watcher -SourceIdentifier mywatch -EventName Created -Action { Move-Item $EventArgs.FullPath $toPath } #Unregister-Event -SourceIdentifier mywatch
ファイルサーバーはどちらもWindowsServer2008R2、自PCはWindows8です。
- 回答としてマーク qoo_man 2013年11月26日 8:04
-
こんにちは、
あまりお役に立たなかったようで申し訳ございません。
ただ、お話からすると監視自体は出来ているようですから単純にファイル移動の問題のように感じます。
「Move-Item : ソースとターゲット パスは同一のルートを持たなければなりません。[移動] 操作はボリューム間で行えません。」のメッセージを検索したところ、同じ問題が発生しているケースも見つかりました。
プロバイダが異なっていると発生するような事が書いてありますのでサーバーOSの種類やバージョンの影響を受けたりするのかも、と思ったりしています。(NASなんかだったりすると怪しさいっぱい?)
何にしても「Move-Item」だけの問題であれば、Copy-ItemとRemove-Itemの組み合わせに変更するとか、RoboCopyコマンドを使ったりとかで回避できるのではと思います。