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
...

有没有更好的模式或更好的编写方式来减少代码量?

4

2 回答 2

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

如果您发布一个示例,其中脚本块中有冗余但它们并不完全相同,那么展示如何最好地抽象它的示例会更容易。可能没有万能的解决方案。

于 2017-01-16T00:24:56.723 回答
-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()
于 2017-01-16T00:15:52.953 回答