none
Powershell startet Script in der Urversion RRS feed

  • 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

    Dienstag, 28. Oktober 2014 13:33

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.
    Des weiteren vermute ich mal das du eine Funktion aufrufst bevor du Sie Deklarierst, dies ist ein beliebter Anfänger Fehler ;-)

    Eine Funktion ist ein Stück Code der über einen Namen ausgeführt werden kann.
    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
    Dienstag, 28. Oktober 2014 14:02
  • 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
    Dienstag, 28. Oktober 2014 15:32
  • 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.

    Ich werde das Gefühl nicht los, das du den Unterschied zwischen Script und Modul noch nicht so richtig verinnerlicht hast.

    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
    Mittwoch, 29. Oktober 2014 07:41

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.
    Des weiteren vermute ich mal das du eine Funktion aufrufst bevor du Sie Deklarierst, dies ist ein beliebter Anfänger Fehler ;-)

    Eine Funktion ist ein Stück Code der über einen Namen ausgeführt werden kann.
    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
    Dienstag, 28. Oktober 2014 14:02
  • 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?

    Dienstag, 28. Oktober 2014 14:14
  • 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
    Dienstag, 28. Oktober 2014 15:32
  • 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.

    Mittwoch, 29. Oktober 2014 06:27
  • 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.

    Ich werde das Gefühl nicht los, das du den Unterschied zwischen Script und Modul noch nicht so richtig verinnerlicht hast.

    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
    Mittwoch, 29. Oktober 2014 07:41
  • Vielen Dank,

    jetzt habe ich es kapiert.

    Ich werde die Module einzeln testen und die Module in dem Hauptprogramm zum schluss wieder entfernen. Damit sollte es dann klappen.
    • Bearbeitet h725rk Mittwoch, 29. Oktober 2014 08:19
    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+

    Mittwoch, 29. Oktober 2014 09:38