0

Так у меня есть сценарий, который устанавливается для следующих целей:Powershell - смотреть несколько папок, запускать несколько процессов с файлами

  1. Если файл находится в папке, просто переместить его в выше этой подпапке папки он появился в. * Например: перейдите из c: \ My_Documents \ a> c: \ My_Documents *
  2. Каждый раз, когда это происходит, имя файла и номер попытки хранятся в хэш-таблице. После того, как тот же файл появился в 3 раза, файл перемещается в совершенно другую папку из структуры, и электронное письмо отправляется в соответствующий запрос. * Пример: c: \ My_Documents \ a> c: \ FailedFolder \ *
    1. Запись файла в хеш-таблице затем удаляется. Также вся хэш-таблица очищается каждые 10 минут.

Это работает, моя проблема в настоящее время является то, что мне нужно, чтобы расширить это так, что скрипт делает это для нескольких папок, которые устанавливаются в точно так же, но не перекрывают друг друга. * Например: C: \ My_Documents \ а> с: \ My_Documents \ & & C: \ randomFolder \ а> с: \ randomFolder \ & & C: \ AnotherRandomFolder \ а> с: \ 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? I.e $ f3, $ f4, $ f5 и т. Д.? – Hitmand

+0

Идея использования функции заключается в том, что вы можете отслеживать любое количество папок. $ f1 и $ f2 выше - это просто имена переменных, это было сделано, чтобы вы могли перестать смотреть папки (если нужно) в более поздней точке сценария. Извинения, эти переменные можно было бы назвать немного лучше :) –

+0

Получение ошибки, что файловая система уже зарегистрирована. Я думаю, вы не можете передать несколько папок таким образом. – Hitmand

Смежные вопросы