2017-01-15 2 views
2

Новое в Powershell. Я пишу скрипт, который следит за файлами в каталоге и сообщает об изменениях в консоли.Как удалить дубликат кода в блоке скрипта?

Я замечаю совсем немного дублирования кода в блоках сценариев, которые я использую для FS наблюдателей.

Вот фрагмент блоков сценариев. Я могу опубликовать весь сценарий, если это необходимо, это немного дольше, и есть немного больше.

# Filter all files 
$filter = "*.*" 
$watcher = New-Object IO.FileSystemWatcher $watchdir, $filter -Property @{ 
    IncludeSubdirectories = $true 
    EnableRaisingEvents = $true 
} 

# File creation 
Register-ObjectEvent $watcher Created -SourceIdentifier Created -Action { 
    $path = $Event.SourceEventArgs.FullPath 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    $message = "The file '$name' was '$changeType' at '$timeStamp'" 
    Write-Host $message 
} 

# File change 
Register-ObjectEvent $watcher Changed -SourceIdentifier Changed -Action { 
    $path = $Event.SourceEventArgs.FullPath 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    $message = "The file '$name' was '$changeType' at '$timeStamp'" 
    Write-Host $message 
} 

# File rename 
... 

# File delete 
... 

Есть ли хороший образец или лучший способ написать это, чтобы уменьшить количество кода?

+1

Оберните избыточный код в функции. Затем вызовите эту функцию, как вам часто нужно. –

+0

В принципе, мне интересно, есть ли идиоматический способ сделать это. Например, как вы обрабатываете область видимости переменной '$ watcher' и передаете параметры и т. Д. – jmreicha

ответ

3

в ваших примерах скриптовые блоки точно так же, так что в этом случае, просто поместите их в переменную и передать вместе:

$action = { 
    $path = $Event.SourceEventArgs.FullPath 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    $console_message = "The file '$name' was '$changeType' at '$timeStamp'" 
    Write-Host message 
} 

# File creation 
Register-ObjectEvent $watcher Created -SourceIdentifier Created -Action $action 

# File change 
Register-ObjectEvent $watcher Changed -SourceIdentifier Changed -Action $action 

Если вы разместите пример, где есть избыточность в блоках сценариев, но они не являются точно таким же, то было бы легче показать пример того, как наилучшим образом абстрактного что. Там может быть не одноразовое решение.

+0

К счастью, все действия одинаковы, поэтому этот подход работает хорошо для меня. Спасибо. – jmreicha

-1

Вы должны быть оборачивать повторно код в функции, смотрите здесь для объяснения о том, как сделать это: http://windowsitpro.com/windows/create-your-own-powershell-functions

В вашем случае, я хотел бы создать следующую функцию:

function FileChange { 
    Register-ObjectEvent $watcher Created -SourceIdentifier Created -Action { 
    $path = $Event.SourceEventArgs.FullPath 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    $console_message = "The file '$name' was '$changeType' at '$timeStamp'" 
    Write-Host message 
} 

Затем используйте его заменить повторяющийся код:

# Filter all files 
$filter = "*.*" 
$watcher = New-Object IO.FileSystemWatcher $watchdir, $filter -Property @{ 
IncludeSubdirectories = $true 
EnableRaisingEvents = $true 
} 

# File creation 
FileChange() 

# File change 
FileChange() 
+3

Функция образца синтаксически недействительна, и ваш сценарий дважды регистрирует обработчик для одного и того же события (' Created') –