Так у меня есть сценарий, который устанавливается для следующих целей:Powershell - смотреть несколько папок, запускать несколько процессов с файлами
- Если файл находится в папке, просто переместить его в выше этой подпапке папки он появился в. * Например: перейдите из c: \ My_Documents \ a> c: \ My_Documents *
- Каждый раз, когда это происходит, имя файла и номер попытки хранятся в хэш-таблице. После того, как тот же файл появился в 3 раза, файл перемещается в совершенно другую папку из структуры, и электронное письмо отправляется в соответствующий запрос. * Пример: c: \ My_Documents \ a> c: \ FailedFolder \ *
- Запись файла в хеш-таблице затем удаляется. Также вся хэш-таблица очищается каждые 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
Я собираюсь попробуйте это сейчас. Чтение кода будет работать столько же папок, сколько я укажу в формате $ f? I.e $ f3, $ f4, $ f5 и т. Д.? – Hitmand
Идея использования функции заключается в том, что вы можете отслеживать любое количество папок. $ f1 и $ f2 выше - это просто имена переменных, это было сделано, чтобы вы могли перестать смотреть папки (если нужно) в более поздней точке сценария. Извинения, эти переменные можно было бы назвать немного лучше :) –
Получение ошибки, что файловая система уже зарегистрирована. Я думаю, вы не можете передать несколько папок таким образом. – Hitmand