windows - Hvordan de-duplikere kode i scriptblok?

Indlæg af Hanne Mølgaard Plasc

Problem



Ny til Powershell. Jeg skriver et script, der ser filer i en mappe og rapporterer ændringerne til konsollen.


Jeg bemærker ganske lidt kodeoverlapning i scriptblokkene, jeg 'm bruger til FS' watchers '.


Her er et uddrag af scriptblokkene. Jeg kan sende hele scriptet, hvis det er nødvendigt, det er lidt længere, og der er lidt mere på gang.


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


Er der et godt mønster eller pænere måde at skrive dette på for at reducere mængden af ​​kode?

Bedste reference


I dine eksempler er scriptblokkene nøjagtigt de samme, så i så fald skal du blot sætte dem i en variabel og sende det sammen:


$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


Hvis du skriver et eksempel, hvor der er redundans i scriptblokkene, men de er ikke ens, så ville det være nemmere at vise et eksempel på, hvordan man bedst kan abstrakte det. Der må ikke være en one-size-passer-alle opløsning.

Andre referencer 1


Du skal indpakke genanvendt kode til funktioner, se her for en forklaring på, hvordan du gør det: http://windowsitpro.com/windows/create-your-own-powershell-functions[5]


I dit tilfælde ville jeg oprette følgende funktion:


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
}


Brug derefter den til at erstatte gentagen kode:


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

# File creation
FileChange()

# File change
FileChange()