none
Hilfe bei Variablen-Scope benötigt RRS feed

  • Frage

  • Hallo zusammen,

    ich (Powershell Anfänger) bräuchte Hilfe….

    Also ich habe eine FileSystemWatcher Funktion mit der ich mehrere Dateien überwache.

    function New-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-Object System.IO.FileSystemWatcher

              $FileSystemWatcher.Path = $FilePathToWatch

              $FileSystemWatcher.Filter = $FileFilter

              $FileSystemWatcher.NotifyFilter = $NotifyFilter

              $FileSystemWatcher.IncludeSubdirectories = $Recurse

              $FileSystemWatcher.EnableRaisingEvents = $true

              $PSO = New-Object PSObject -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-Object PSObject -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 ($FilePath in $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

    Mittwoch, 24. Februar 2016 15:48

Antworten

  • Ich nehme an mit "Editor" meinst du den ISE?
    Der Grund warum das im ISE funktioniert ist das der ISE -ich nehme an aus Debugging-Gründen- im Gegensatz zur Console den Runspace nicht zerstört, nachdem ein Script gelaufen ist. D.h. wenn du sie nicht explizit löschst, sind alle Variablen immer noch inkl. Werte vorhanden. Das führt leider immer wieder zu Überraschungen, genau wie bei dir.
    In PowerGUI ist das zwar per Default ähnlich, allerdings kann man hier einstellen, ob der Runspace vor dem Start eines Scriptes zurückgesetzt werden soll.

    Wenn ich das richtig verstehe und du den Filesystemwatcher in einem eigenen Script startest, was sich dann direkt wieder beendet, dann funktioniert das so gar nicht.
    Das ist eine temporäre Event-Subscription. Wenn das Script bzw. die Console endet, tuts auch der Filesystemwatcher.
    Du kannst also entweder diesen in ein Script integrieren das permanent im Hintergrund läuft oder du kannst es mit dauerhaften WMI-Subscriptions versuchen. Siehe:
    Permanent WMI Event Subscriptions
    PowerEvents Module

    Grüße, Denniver



    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 25. Februar 2016 13:54
    Moderator

Alle Antworten

  • Hallo,

    warum setzten Sie nicht auf der Function Global Scope?

    Gruß,

    Teodora


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 25. Februar 2016 13:18
    Moderator
  • Ich nehme an mit "Editor" meinst du den ISE?
    Der Grund warum das im ISE funktioniert ist das der ISE -ich nehme an aus Debugging-Gründen- im Gegensatz zur Console den Runspace nicht zerstört, nachdem ein Script gelaufen ist. D.h. wenn du sie nicht explizit löschst, sind alle Variablen immer noch inkl. Werte vorhanden. Das führt leider immer wieder zu Überraschungen, genau wie bei dir.
    In PowerGUI ist das zwar per Default ähnlich, allerdings kann man hier einstellen, ob der Runspace vor dem Start eines Scriptes zurückgesetzt werden soll.

    Wenn ich das richtig verstehe und du den Filesystemwatcher in einem eigenen Script startest, was sich dann direkt wieder beendet, dann funktioniert das so gar nicht.
    Das ist eine temporäre Event-Subscription. Wenn das Script bzw. die Console endet, tuts auch der Filesystemwatcher.
    Du kannst also entweder diesen in ein Script integrieren das permanent im Hintergrund läuft oder du kannst es mit dauerhaften WMI-Subscriptions versuchen. Siehe:
    Permanent WMI Event Subscriptions
    PowerEvents Module

    Grüße, Denniver



    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 25. Februar 2016 13:54
    Moderator