如何删除脚本块中的重复代码?
How to de-duplicate code in script block?
Powershell 的新手。我正在编写一个脚本来监视目录中的文件并向控制台报告更改。
我注意到我用于 FS "watchers" 的脚本块中有相当多的代码重复。
这是脚本块的片段。如果需要,我可以 post 整个脚本,它有点长,还有更多内容。
# 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
...
是否有更好的模式或更好的写法来减少代码量?
您应该将重复使用的代码包装到函数中,有关如何操作的说明请参见此处: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()
在您的示例中,脚本块完全相同,因此在这种情况下,只需将它们放入变量中并传递:
$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
如果您 post 一个脚本块中存在冗余但它们并不完全相同的示例,那么展示一个如何最好地抽象它的示例会更容易。可能没有 one-size-fits-all 解决方案。
Powershell 的新手。我正在编写一个脚本来监视目录中的文件并向控制台报告更改。
我注意到我用于 FS "watchers" 的脚本块中有相当多的代码重复。
这是脚本块的片段。如果需要,我可以 post 整个脚本,它有点长,还有更多内容。
# 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
...
是否有更好的模式或更好的写法来减少代码量?
您应该将重复使用的代码包装到函数中,有关如何操作的说明请参见此处: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()
在您的示例中,脚本块完全相同,因此在这种情况下,只需将它们放入变量中并传递:
$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
如果您 post 一个脚本块中存在冗余但它们并不完全相同的示例,那么展示一个如何最好地抽象它的示例会更容易。可能没有 one-size-fits-all 解决方案。