windows - 如何消除脚本 block 中的重复代码?

标签 windows powershell scripting closures scriptblock

Powershell 新手。我正在编写一个脚本来监视目录中的文件并向控制台报告更改。

我注意到我用于 FS“观察者”的脚本 block 中有相当多的代码重复。

这是脚本 block 的片段。如果需要,我可以发布整个脚本,它有点长,而且还有更多内容。

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

是否有一个好的模式或更好的编写方法来减少代码量?

最佳答案

在您的示例中,脚本 block 完全相同,因此在这种情况下,只需将它们放入变量中并传递即可:

$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

如果您发布的示例中脚本 block 存在冗余但它们并不完全相同,那么展示如何最好地抽象它的示例会更容易。可能没有一种放之四海而皆准的解决方案。

关于windows - 如何消除脚本 block 中的重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666818/

相关文章:

c++ - 有没有办法在每个启动的新进程上从 Windows 获取事件?

powershell - 如何在 PowerShell 中发布到 URL?

azure - 使用 az 模板在 Azure Function 上运行 Powershell 命令

bash - 将 "-I"标志添加到 bash 中的路径字符串

c++ - 限制数组类型的大小,同时还没有实例

c++ - Process Explorer 如何从 XP Guest 帐户枚举所有进程名称?

c++ - 解码 Opus 音频数据

javascript - 在javascript中如何调用powershell脚本

python - 如何在纯 Python 中对 Python 进行沙箱处理?

linux - 使用文本文件作为输入?我究竟做错了什么?