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 に答える