2012-03-31 8 views
0

Ich habe ein Skript, das gut funktioniert. Es ist ziemlich komplex und macht zahlreiche "Dinge" .. Mein Problem begann, als ich das gesamte 1000-Zeilen-Skript in eine While-Schleife legte.Ich muss meinen runspace zwischen jeder Schleife reinigen - wie räume ich mein Skript auf

Einige/viele meiner Variablen sind doppelt und für jede Schleife durcheinander gebracht ..

Dies ist natürlich, weil ich das Skript im selben Runspace ausführen .. Also, was soll ich tun? Lösche alle meine Variablen mit remove-variable am Ende meines Skripts? Oder gibt es eine Art magische Sache, die mir erlaubt, meinen Runspace zwischen jedem Lauf zu löschen?

Ich habe das Gefühl, dass ich Dinge durcheinander gebracht habe und dass ich eine Art Scanner brauche, der mir sagt, ob ich nicht benötigte Funktionen/Variablen habe. Ich bin immer noch in den frühen Phasen des Lernens und dieses Skript ist bei mir "den ganzen Weg", so ist es auf keinen Fall eine gute Codierung ..

Also, was wäre "Best Practice" in meiner Situation?

+0

Hallo Bart! Warum hast du meine Frage bearbeitet? – Sune

+0

Vielleicht müssen alle 1000 Zeilen nicht in einer Schleife ausgeführt werden? :-) –

+0

Am besten wäre es, es in kleinere Skripte aufzuteilen und (oder auf Knopfdruck) Ihre Variablen explizit zu initialisieren. Eine Art von klarem Runspace-Manöver würde das Symptom ansprechen, Sie könnten das gleiche Problem innerhalb eines Laufs haben. –

Antwort

1

Sie etwas hinzufügen könnte so zum Initialisierungsskript für den Job:

$sysvars = get-variable | select -Expand name 

    function remove-uservars { 
    get-variable | 
     where {$sysvars -notcontains $_.name} | 
     remove-variable 
    } 

Dann an der Spitze Ihrer while-Schleife, dot die remove-UserVars Funktion Quelle:

. remove-uservars 

Die alle Variablen Ihr Skript vor jeder Schleife beginnt erstellt entfernen sollte.

+0

Fanrastisch! Genau das, was ich gesucht habe :) Aber warum sollte ich die Funktion dot-source? Um den globalen Geltungsbereich zu beeinflussen? – Sune

+0

Sie würden es dot-source geben, um den aktuellen Bereich zu beeinflussen (der der globale Bereich sein kann oder nicht). – mjolinor

2

mit einem sauberen „Umfang“ jede Zeit, die ausreichend ist, dann Wenn Start versuchen Sie dies:

while (<loop_condition>) 
{ 
    & { 
     ... 1000 lines of script 
    } 
} 

Jedes Mal, wenn Sie die „1000 Zeilen Skript“ execute über Sie lokal einen neuen Bereich so Variablen erhalten werden Dieser Bereich muss erneut initialisiert werden. Wenn Ihr Skript globale oder Skriptvariablen wie z. $global:foo oder $script:bar dann funktioniert dieser Ansatz möglicherweise nicht (hängt davon ab, ob die globalen/Skriptänderungen zwischen Schleifeniterationen bestehen bleiben sollen oder nicht).

Das folgende (zugegebenermaßen erfundene Beispiel) zeigt, wie Sie einen neuen Bereich zu schaffen Ihnen jedes Mal durch die Schleife eine neue Reihe von „lokalen“ Variablen geben kann:

PS> while (1) { $local += 10; Start-Sleep -milli 500; $local } 
10 
20 
30 
40 
PS> while (1) { & {$local += 10; Start-Sleep -milli 500; $local} } 
10 
10 
10 
10 

Wenn Sie wirklich eine ganz frische Runspace müssen (sauberer Schiefer von globalem und Skriptvariablen) können Sie einen Job stattdessen beginnen, die Sie erhalten eine Marke jedes Mal durch die Schleife neu Runspace versohlt aber die perf wird nicht so gut sein:

while (<loop_condition>) 
{ 
    $job = Start-Job { <path to 1000 line script> } 
    Wait-Job $job 
    Receive-Job $job 
} 
Verwandte Themen