Hallo zusammen,
ich (Powershell Anfänger) bräuchte Hilfe….
Also ich habe eine FileSystemWatcher Funktion mit der ich mehrere Dateien überwache.
functionNew-FSWatcher {
#region Parameters
[CmdletBinding()]
param (
[Scriptblock]$EventAction,
[String]$Event="Changed",
[String]$FileFilter="*.*",
[System.IO.FileInfo]$FilePathToWatch,
[System.IO.NotifyFilters]$NotifyFilter="LastWrite",
[Switch]$Recurse
)
#endregion Parameters
try {
$FileSystemWatcher=New-ObjectSystem.IO.FileSystemWatcher
$FileSystemWatcher.Path=$FilePathToWatch
$FileSystemWatcher.Filter=$FileFilter
$FileSystemWatcher.NotifyFilter=$NotifyFilter
$FileSystemWatcher.IncludeSubdirectories=$Recurse
$FileSystemWatcher.EnableRaisingEvents=$true
$PSO=New-ObjectPSObject-property @{Action=$EventAction}
$FSW=Register-ObjectEvent-InputObject$FileSystemWatcher-Event$Event-MessageData$PSO-Action ({
&$Event.MessageData.Action
}) |Out-Null
}
catch {Write-Host"Fehler"}
}
Mein “Problem“ am FileSystemWatcher ist, dass dieser in einem eigenen Scope läuft und ich Globale Variablen vermeiden möchte. Ich habe mir beholfen, indem ich die Aktion in ein Objekt lade.
$PSO=New-ObjectPSObject-property @{Action=$EventAction}
Hier ein kleines Beispiel:
$AllFilePath= @("C:\File1.txt","C:\ File2.txt ")
$Script:Wert1= 1
$Script:Wert2= 2
$Action= {
Write-Host$Script:Wert1
Write-Host$Script:Wert2
$Script:Wert3=$Script:Wert1+$Script:Wert2
Write-verbose$Script:Wert3
}
foreach ($FilePathin$AllFilePath) {
New-FSWatcher-FilePath (Split-Path$FilePath)-FileFilter (Split-Path$FilePath-Leaf)-EventAction$Action
}
Soweit funktioniert das auch alles, wenn ich das Skript im Editor ausführe. Versuche ich aber das Skript im Arbeitsplatz per "Rechtsklick - Mit Powershell ausführen" zu starten, sind die Variablen nicht gefüllt. Besteht hier irgendein Unterschied wie das Skript ausgeführt wird? Und hat vielleicht einer eine Idee wie ich mir behelfen könnte?
Schon mal vielen Dank