2016-05-17 23 views
0

このクエリをpowershellで実行しようとしていますが、現在の$MonitorFolder\\\vavm\CINICO\Incomingとして実行すると、フォルダにファイルを追加するときにクエリが機能しません。 $MonitorFolderの変数をC:\Users\RickG\Desktop\Test Reportsに変更すると、ファイルをフォルダに追加するときにコードが正常に動作します。では、ファイルがフォルダに追加されたときに、どのようにして\\vavm\CINICO\Incomingのパスを監視しますか?ここでファイルのネットワークフォルダを監視します

はフォルダをチェックするコードの私の最初の部分の抜粋です:

$MonitorFolder = "\\vavm\CINICO\Incoming" 
$MonitorStopFile = "monitor.die" 
$smtpServer = "mail.test.org" 
$smtpFrom = "[email protected]" 
$smtpTo = "[email protected]" 


$SourceID = "MonitorFiles" 

$smtpSubject = "New file arrived in $($MonitorFolder)" 
$Query = @" 
SELECT * FROM __InstanceCreationEvent WITHIN 10 
WHERE targetInstance ISA 'Cim_DirectoryContainsFile' 
AND targetInstance.GroupComponent = 'Win32_Directory.Name="$($MonitorFolder.Replace("\", "\\\\"))"' 
"@ 

SOLUTION:

$MonitorFolder = "\\vavm\CINICO\incoming" 
$MonitorStopFile = "monitor.die" 

$smtpServer = "mail.test.org" 
$smtpFrom = "[email protected]" 
$smtpTo = "[email protected]" 
$smtpSubject = "New file arrived in $($MonitorFolder)" 
$SourceID = "MonitorFiles" 
$IncomingFiles = Get-ChildItem $MonitorFolder 

$smtp = New-Object -TypeName "Net.Mail.SmtpClient" -ArgumentList $smtpServer 

$watcher = New-Object System.IO.FileSystemWatcher $MonitorFolder 
#Files only. Default is files + directory 
$watcher.NotifyFilter = [System.IO.NotifyFilters]'FileName,LastWrite' 

$newFileSubscription = Register-ObjectEvent -InputObject $watcher -EventName Created -SourceIdentifier NewFileCreated -Action { 
Write-Host "New file named '$($Event.SourceEventArgs.Name)' arrived in $($MonitorFolder)" 

$smtpBody += "`n[$(Get-Date -Format HH:mm:ss)]`tNew file named '$($Event.SourceEventArgs.Name)' arrived in $($MonitorFolder)" 

if($Event.SourceEventArgs.Name -eq $MonitorStopFile) { 
    Write-Host "Monitoring stopped" 
    #Stop monitoring 
    Unregister-Event -SubscriptionId $newFileSubscription.Id 
    #Dispose FileSystemWatcher 
    $watcher.Dispose() 
} 
$smtp.Send($smtpFrom, $smtpTo, $smtpSubject, $smtpBody)  
} 
+0

「動作しない」とはどういう意味ですか?間違いはありますか? –

+0

サンプルが不完全です。あなたはWMI-eventsubscriberを登録しません –

+0

wmiイベントをフルコードで登録しますので、ちょうどスニペットです – SikRikDaRula

答えて

2

私は__InstanceCreationEventは、リモートの共有をサポートしていない99%確信しています。 WMIイベントは、何も購読していない場合でもコンピュータによってトリガされます。お使いのコンピュータはネットワーク上のファイル共有を監視することはできません。

リモート共有を監視するには、System.IO.FileSystemWatcherを試してください。 Ex。ログに新しいアイテムがある場合は、これまで分のメールを作成するには、「NEWFILES」-logを格納するためのスレッドセーフなグローバルのArrayListとwhileループして上にサンプルを更新しました

$MonitorFolder = "\\vavm\CINICO\Incoming" 
$MonitorStopFile = "monitor.die" 

$smtpServer = "mail.test.org" 
$smtpFrom = "[email protected]" 
$smtpTo = "[email protected]" 
$smtpSubject = "New file arrived in $($MonitorFolder)" 
$SourceID = "MonitorFiles" 

$smtp = New-Object -TypeName "Net.Mail.SmtpClient" -ArgumentList $smtpServer 

$watcher = New-Object System.IO.FileSystemWatcher $MonitorFolder 
#Files only. Default is files + directory 
$watcher.NotifyFilter = [System.IO.NotifyFilters]'FileName,LastWrite' 

#Using a thread-safe collection (in global scope so Action-block can reach it) to store the log just to be safe. 
$global:newFiles = [System.Collections.ArrayList]::Synchronized((New-Object System.Collections.ArrayList)) 

$newFileSubscription = Register-ObjectEvent -InputObject $watcher -EventName Created -SourceIdentifier NewFileCreated -Action { 
    Write-Host "New file named '$($Event.SourceEventArgs.Name)' arrived in $($MonitorFolder)" 
    $global:newFiles.Add("[$(Get-Date -Format HH:mm:ss)]`tNew file named '$($Event.SourceEventArgs.Name)' arrived in $($MonitorFolder)") 

    if($Event.SourceEventArgs.Name -eq $MonitorStopFile) { 
     Write-Host "Monitoring stopped" 
     #Stop monitoring 
     Unregister-Event -SubscriptionId $newFileSubscription.Id 
     #Dispose FileSystemWatcher 
     $watcher.Dispose() 
    } 
} 

while ($watcher.EnableRaisingEvents -or $global:newFiles.Count -gt 0) { 

    #Sleep 
    Start-Sleep -Seconds 60 

    if($global:newFiles.Count -gt 0) { 
     #Convert list of strings to single string (multiline) 
     $smtpbody = $global:newFiles | Out-String 

     $smtp.Send($smtpFrom, $smtpTo, $smtpSubject, $smtpBody) 

     #Mail sent, Empty array 
     $global:newFiles.Clear() 
    } 

} 

+0

私のコードでシステムファイルウォッチャーを使う方法がわからず、どこに置くべきかわかりません。私はpowershellの初心者です。私のコードを含むサンプルの助けがありがたいです。私が家に帰ると、私は試してみる。 – SikRikDaRula

+0

サンプルを更新した。 filesystemwatcherはwmi-eventと同じように動作します。監視を設定し、イベントに実行されるアクションを含めます。何も違う。サンプル –

+0

を参照してください。Okこれは電子メールを送信する作業ですが、フォルダに3つのファイルをドロップすると3つの電子メールが送信されます。複数のファイルをドラッグしてフォルダにドロップした場合、解決策の作業コード: – SikRikDaRula

関連する問題