0

で複数のプロセスを実行するだから私は、次の目的のためにセットアップされたスクリプトがあります:ファイルがフォルダ内に表示された場合PowerShellの - ウォッチ、複数のフォルダは、ファイル

  1. を単にそのサブフォルダ上のフォルダに移動します*例:c:¥My_Documents¥a> c:¥My_Documentsから移動する
  2. 毎回、ファイル名と試行番号がハッシュテーブルに格納されます。同じファイルが3回出現すると、ファイルは構造体とは全く別のフォルダに移動さ​​れ、適切な領事館に電子メールが送信されます。 *例:c:¥My_Documents¥a> c:¥FailedFolder¥*
    1. ハッシュテーブル内のファイルのレコードは削除されます。また、ハッシュテーブル全体が10分ごとにクリアされます。

これは動作しますが、私の問題は、今私は、スクリプトがまったく同じように設定されているが、重複していない複数のフォルダのためにこれを行うように、これを展開する必要があるということです。 *例:c:\ My_Documents \> C:\ My_Documents & & C \:\ randomFolder \> C:\ randomFolder & & C \:\ AnotherRandomFolder \> C:\ AnotherRandomFolder \ *

してください誰かがこれを達成するのを助けることができる?そのようなことを自分で実装する必要はありません

$global:folder = 'C:\Users\random\Documents\IUR Test\r' # Enter the root path you want to monitor. 
$global:origin = 'C:\Users\random\Documents\IUR Test' 
$filter = '*.*' # You can enter a wildcard filter here. 
$global:Failedfolder = 'C:\Users\random\Documents\Failed' 
$global:Files = @{} 
$timer = New-Object Timers.Timer 
$timer.Interval = 600000  # fire every 10 minutes 
$timer.AutoReset = $true # Enable the event again after its been fired 
$timer.Enabled = $true 

# In the following line, you can change 'IncludeSubdirectories to $true if required.       
$fsw = New-Object IO.FileSystemWatcher $global:folder, $filter -Property @{IncludeSubdirectories = $false; NotifyFilter = [IO.NotifyFilters]'FileName,LastWrite'} 

Register-ObjectEvent -InputObject $timer -EventName Elapsed -SourceIdentifier HashMapClear -Action { 
    $global:Files.clear() 
} 

Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
    ForEach ($file in (gci $global:folder)) 
    { 
     $fName = $file.Name 

     if(-not $global:Files.ContainsKey($fName)) 
     { 
      $global:Files.Add($fName,1)    
      Move-Item $File.Fullname $global:origin -force 

     } 
     Elseif($global:Files.Get_Item($fName) -lt 3) 
     { 
      $global:Files.Set_Item($fName,++$global:Files.Get_Item($fName))    
      Move-Item $File.Fullname $global:origin -force 
     } 
     Else 
     { 
      $global:Files.Remove($fName) 
      Move-Item $File.Fullname $global:Failedfolder -force 

      #### Send error email 
     } 
    } 
} 

# To stop the monitoring, run the following commands: 
# Unregister-Event FileCreated 
# Unregister-Event HashMapClear 

答えて

0

私の現在のコードを参照してください。あなたは非常に使いやすいPowershellGuardを使うことができます。また、あなたはプラグインの束に付属してそれに準拠している場合は、ルビーオリジナルのガードを試すことができます。

PowershellGuardは基本的に何をしたいのですか。それで、あなた自身のやり方を再実装したい場合は、そのソースコードを見ることができます。

0

達成しようとしていることを正確に把握していないと、具体的な指針を与えるのが少し難しい場合があります。しかし、あなたが(下記参照)あなたが必要なすべてのパラメータを指定して呼び出すことができますPowerShellの機能を見てみたいことがあり

警告:これは実行またはテストされていません:D

$files = @{} 

$timer = New-Object Timers.Timer 
$timer.Interval = 600000  # fire every 10 minutes 
$timer.AutoReset = $true # Enable the event again after its been fired 
$timer.Enabled = $true 

$email:From = '[email protected]' 
$email:to = '[email protected]' 
$email:Subject = 'Failed SJPM File' 
$email:SMTPServer = 'thisisatest.qa.test.com' 
$email:SMTPPort = 25 

function sendFailureEmail([string]$filename, [string]$folder) 
{ 
    $message = 'The file' + $filename + ' located in ' + $folder + ' has failed to process after 3 attempts, please review the file.' 
    send-MailMessage -From $email:From -to $email:to -Subject $email:Subject -Body $message -SmtpServer $email:SMTPServer -port $email:SMTPPort -Cc $email:From 
} 

function monitorDirectory([string]$sourceDirectory, [string]$targetDirectory, [string]$failureDirectory, [string]$filter="*.*") 
{ 
    # In the following line, you can change 'IncludeSubdirectories to $true if required.       
    $fsw = New-Object IO.FileSystemWatcher $sourceDirectory, $filter -Property @{IncludeSubdirectories = $false; NotifyFilter = [IO.NotifyFilters]'FileName,LastWrite'} 

    Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
     ForEach ($file in (gci $sourceDirectory)) 
     { 
      $fName = $file.FullName 

      if(-not $files.ContainsKey($fName)) 
      { 
       # We have not seen this file before 
       $files.Add($fName, 1)    
       Move-Item $File.Fullname $targetDirectory -force 

      } 
      Elseif($files.Get_Item($fName) -lt 3) 
      { 
       # We have seen this file once or twice before 
       $files.Set_Item($fName, ++$files.Get_Item($fName))    
       Move-Item $File.Fullname $targetDirectory -force 
      } 
      Else 
      { 
       # This is the third time we've seen this file, there an error has occurred 
       $files.Remove($fName) 
       Move-Item $File.Fullname $failureDirectory -force 

       sendFailureEmail $fName $failureDirectory 
      } 
     } 
    } 

    $fsw 
} 

Register-ObjectEvent -InputObject $timer -EventName Elapsed -SourceIdentifier HashMapClear -Action { 
    # Clear the file list every x minutes 
    $files.clear() 
} 

$f1 = monitorDirectory 'C:\Users\random\Documents\IUR Test\r' 'C:\Users\random\Documents\IUR Test' 'C:\Users\random\Documents\Failed' 
$f2 = monitorDirectory 'C:\Users\random\Documents\Test2\z' 'C:\Users\random\Documents\Test2' 'C:\Users\random\Documents\Failed' 

# can unregister filewatching and timers if necessary 
+0

私はするつもりです今これを試してみてください。コードを読むことは、$ f形式で指定した数のフォルダで動作しますか?私は$ f3、$ f4、$ f5など? – Hitmand

+0

関数を使用するという考えは、任意の数のフォルダを監視できるということです。上記の$ f1と$ f2は変数名です。これは、スクリプトの後の時点で(必要な場合)フォルダの監視を停止できるようにするためのものです。お詫び申し上げます、これらの変数は少し良くなりました:) –

+0

filesystemwatcherが既に登録されているというエラーを取得しています。私はあなたがこの方法で複数のフォルダを渡すことはできないと思う。 – Hitmand

関連する問題