Benutzer mit den meisten Antworten
Powershell startet Script in der Urversion

Frage
-
Hallo,
ich sitze gerade an einem Programm, dass ich mit Powershell baue.
Lieder habe ich folgendes Problem:Ich starte die Datei ganz normal mit Powershell. Wenn ich nun was am Code verändere, abspeichere und wieder starte führt die Powershell den nicht veränderten Code aus, also den Code vorm Verändern und Speichern der Datei.
Sobald ich die Powershell schliesse und neu starte führt diese den neuen Code aus.
Veränder ich ich wieder was, führt diese den alten Code aus und das geht immer weiter so.Kann mir einer sagen an was das liegen kann? Das geht mir langsam auf die nerven.
Danke im voraus,
Rob
Antworten
-
Hallo Rob!
Wenn man PowerShell sagt muss man sagen welches PowerShell Programm (der PowerShell Host) man benutzt.
Ich vermute mal das du die PowerShell Entwicklungsumgebung PowerShell ISE benutzt.
Eine Funktion ist ein Stück Code der über einen Namen ausgeführt werden kann.
Des weiteren vermute ich mal das du eine Funktion aufrufst bevor du Sie Deklarierst, dies ist ein beliebter Anfänger Fehler ;-)
Dadurch kann man bequem ein Stück Code immer wieder verwenden in dem man einfach den Namen der Funktion aufruft erst bei diesem Aufruf wird der Code innerhalb der Funktion ausgeführt.Schritt 1.)
Deklarieren der Funktion
Eine Funktion wird mit Ihrem Sourcecode definiert.
PowerShell weiß erst nachdem der Code von der Funktion einmal durchlaufen wurde, das es eine Funktion mit diesem Namen gibt.
Die Funktion wurde bekannt gemacht, oder man sagt auch die Funktion wurde Deklariert und in das PowerShell Function: Laufwerk „installiert“.
Dabei wird eine Funktion noch nicht ausgeführt!
(Wie bei der Installation eines Computer-Programmes. Beim Installieren wird das Programm noch nicht gestartet.)Schritt 2.)
Verwenden der Funktion
Erst nachdem die Funktion bekannt ist kann man die Funktion immer wieder mit dem Namen starten ( Optional mit Übergabe von Argumenten an Funktions-Parameter)
(Auch ein Computer-Programm kann man nach der Installation immer wieder anhand seines Namens Ausführen)# Dieser aufruf VOR der Funktionsdeklaration der Funktion mit dem Namen 'Verb-Noun' geht beim 1. durchlauf schief, # da PowerShell die Funktion noch nicht kennt # Wurde die Funktion verändert so wird immer der alte ungeänderte Code ausgeführt Verb-Noun # Definition (Deklaration) der Funktion mit dem Namen 'Verb-Noun' # Wenn die Funktion verändert wurde, wird hier die Änderung (neu) eingelesen Function Verb-Noun { 'Gruss aus der Funktion: "Verb-Noun"' } # Dieser aufruf NACH der Funktionsdeklaration der Funktion mit dem Namen 'Verb-Noun' funktioniert, # da PowerShell die Funktion nun kennt # Wurde die Funktion geändert so wird hier der Aktuelle Code ausgeführt Verb-Noun
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Als Antwort markiert h725rk Mittwoch, 29. Oktober 2014 08:03
-
Du solltes dir vielleicht überlegen deine Funktionen erst als .ps1 Scripte zu entwickeln und erst zum schluss durch umbenennen in .psm1 eine Modul draus zu machen.
Module müssen erst entladen werden bevor PowerShell diese neu lädt.
Mach mal so :
$ModuleName = 'MeinTollesModul' If(Get-Module -Name $ModuleName -ErrorAction SilentlyContinue) { # Modul ist noch geladen , es wird entfernt Remove-Module $ModuleName } # Modul immer frisch laden... Import-Module $ModuleName
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Als Antwort markiert h725rk Mittwoch, 29. Oktober 2014 08:03
-
Wenn ich das Module so abfrage, dann wird es doch ausgeführt! Oder irre ich mich da.
Du Irrst!
Get-Module fragt ja nur ab ob das Modul schon geladen ist.Import-Module führt das Modul beim laden aus, das machst du ja sowieso weil du das Modul ja Laden musst.
In dem Script wo die Module ausgeführt werden habe ich noch einige andere Aufrufe von Modulen, sollen die am Ende entfernt werden oder kann ich das schon am Anfang machen?
Für jedes Modul das geladen wird, fügst du meinen Beispiel Code an der Stelle ein, wo das Modul geladen wird.
Das importieren des Moduls mache ich auch am Schluss?Module Importieren am Schluss macht gar keinen Sinn! Ein Modul muss immer geladen werden, BEVOR Bestandteile aus dem Modul benutzt werden!
Alle benötigten Module würde ich immer am Anfang eines Skriptes laden und nicht erst an der stelle wo Sie gebraucht werden. Dadurch kann man an einer Stelle im Script sehen, welche abhängigkeiten das Script hat.
Bevor ich die Module auf mein Hauptprogramm loslasse, teste ich diese natürlich in einer ps1-Datei.
Das ist gut so!
Ich entwickle und teste die Funktionen immer einzeln und teste diese, bevor ich diese in die .psm1 Datei schubse.PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Als Antwort markiert h725rk Mittwoch, 29. Oktober 2014 08:03
Alle Antworten
-
Hallo Rob!
Wenn man PowerShell sagt muss man sagen welches PowerShell Programm (der PowerShell Host) man benutzt.
Ich vermute mal das du die PowerShell Entwicklungsumgebung PowerShell ISE benutzt.
Eine Funktion ist ein Stück Code der über einen Namen ausgeführt werden kann.
Des weiteren vermute ich mal das du eine Funktion aufrufst bevor du Sie Deklarierst, dies ist ein beliebter Anfänger Fehler ;-)
Dadurch kann man bequem ein Stück Code immer wieder verwenden in dem man einfach den Namen der Funktion aufruft erst bei diesem Aufruf wird der Code innerhalb der Funktion ausgeführt.Schritt 1.)
Deklarieren der Funktion
Eine Funktion wird mit Ihrem Sourcecode definiert.
PowerShell weiß erst nachdem der Code von der Funktion einmal durchlaufen wurde, das es eine Funktion mit diesem Namen gibt.
Die Funktion wurde bekannt gemacht, oder man sagt auch die Funktion wurde Deklariert und in das PowerShell Function: Laufwerk „installiert“.
Dabei wird eine Funktion noch nicht ausgeführt!
(Wie bei der Installation eines Computer-Programmes. Beim Installieren wird das Programm noch nicht gestartet.)Schritt 2.)
Verwenden der Funktion
Erst nachdem die Funktion bekannt ist kann man die Funktion immer wieder mit dem Namen starten ( Optional mit Übergabe von Argumenten an Funktions-Parameter)
(Auch ein Computer-Programm kann man nach der Installation immer wieder anhand seines Namens Ausführen)# Dieser aufruf VOR der Funktionsdeklaration der Funktion mit dem Namen 'Verb-Noun' geht beim 1. durchlauf schief, # da PowerShell die Funktion noch nicht kennt # Wurde die Funktion verändert so wird immer der alte ungeänderte Code ausgeführt Verb-Noun # Definition (Deklaration) der Funktion mit dem Namen 'Verb-Noun' # Wenn die Funktion verändert wurde, wird hier die Änderung (neu) eingelesen Function Verb-Noun { 'Gruss aus der Funktion: "Verb-Noun"' } # Dieser aufruf NACH der Funktionsdeklaration der Funktion mit dem Namen 'Verb-Noun' funktioniert, # da PowerShell die Funktion nun kennt # Wurde die Funktion geändert so wird hier der Aktuelle Code ausgeführt Verb-Noun
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Als Antwort markiert h725rk Mittwoch, 29. Oktober 2014 08:03
-
Hallo,
ich benutze als Entwicklungsumgebung Sapien Powershell Studio 2012.
Ich habe die Funktion in einer seperaten Moduldatei gespeichert. Diese Datei importiere ich, bevor ich die Funktion aufrufe.
Das hat auch alles mal geklappt. Ich habe letztens bei meinem Rechner alle Updates eingespielt und seitdem ging es nicht mehr. Gibt es vielleicht ein Update was die Powershell so reagieren lässt? -
Du solltes dir vielleicht überlegen deine Funktionen erst als .ps1 Scripte zu entwickeln und erst zum schluss durch umbenennen in .psm1 eine Modul draus zu machen.
Module müssen erst entladen werden bevor PowerShell diese neu lädt.
Mach mal so :
$ModuleName = 'MeinTollesModul' If(Get-Module -Name $ModuleName -ErrorAction SilentlyContinue) { # Modul ist noch geladen , es wird entfernt Remove-Module $ModuleName } # Modul immer frisch laden... Import-Module $ModuleName
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Als Antwort markiert h725rk Mittwoch, 29. Oktober 2014 08:03
-
Wenn ich das Module so abfrage, dann wird es doch ausgeführt! Oder irre ich mich da.
In dem Script wo die Module ausgeführt werden habe ich noch einige andere Aufrufe von Modulen, sollen die am Ende entfernt werden oder kann ich das schon am Anfang machen?
Das importieren des Moduls mache ich auch am Schluss?
Bevor ich die Module auf mein Hauptprogramm loslasse, teste ich diese natürlich in einer ps1-Datei.
-
Wenn ich das Module so abfrage, dann wird es doch ausgeführt! Oder irre ich mich da.
Du Irrst!
Get-Module fragt ja nur ab ob das Modul schon geladen ist.Import-Module führt das Modul beim laden aus, das machst du ja sowieso weil du das Modul ja Laden musst.
In dem Script wo die Module ausgeführt werden habe ich noch einige andere Aufrufe von Modulen, sollen die am Ende entfernt werden oder kann ich das schon am Anfang machen?
Für jedes Modul das geladen wird, fügst du meinen Beispiel Code an der Stelle ein, wo das Modul geladen wird.
Das importieren des Moduls mache ich auch am Schluss?Module Importieren am Schluss macht gar keinen Sinn! Ein Modul muss immer geladen werden, BEVOR Bestandteile aus dem Modul benutzt werden!
Alle benötigten Module würde ich immer am Anfang eines Skriptes laden und nicht erst an der stelle wo Sie gebraucht werden. Dadurch kann man an einer Stelle im Script sehen, welche abhängigkeiten das Script hat.
Bevor ich die Module auf mein Hauptprogramm loslasse, teste ich diese natürlich in einer ps1-Datei.
Das ist gut so!
Ich entwickle und teste die Funktionen immer einzeln und teste diese, bevor ich diese in die .psm1 Datei schubse.PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Als Antwort markiert h725rk Mittwoch, 29. Oktober 2014 08:03
-
Nachtrag:Das entladen der Module ist meistens nur in der Entwicklungsumgebung, zur Entwicklungszeit notwendig.
Deshalb kann das Entladen in der endgültigen Skriptversion entfallen, wenn man den Speicher frei machen möchte, kann man natürlich auch dann das Modul entladen.
Hinweis
Binäre (.dll) Module können nicht entladen werden!
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+