PowerShell - Arbeiten mit unterschiedlichen Funktionen innerhalb eines Skripts
Wie binde ich verschiedene Funktionen richtig in ein einziges Skript ein?
Hallo zusammen!
Ich habe ein Skript, in dem der User zwei Dateien auswählen (öffnen), einen Speicherort bestimmen und etwas bestätigen/auswählen soll. Diese Aufgaben würde ich gern Anwender-freundlich mit ein paar GUIs lösen. Der Benutzer wählt und klickt, das Skript läuft im Hintergrund ab.
Die GUIs sollen dabei durch Funktionen aufgerufen werden. Da ich sowohl ein "Datei öffnen"-Fenster, ein "Speichern unter"-Fenster und eine Sicherheitsabfrage in dem Skript nutzen will, muss ich verschiedene Funktionen nutzen.
Nun zum Problem:
Führe ich das Skript in der ISE aus, läuft alles einwandfrei ab; die Fenster öffnen sich. Starte ich das Skript mit der normalen Powershell per Klick (also so, wie es im Endeffekt auch geschehen wird) geht bloß das Shellfenster auf, der Cursor blinkt. Wie ich herausgefunden habe, liegt das Problem scheinbar beim Aufurf der Funktion durch
Einbindung der Funktion
Aufruf
Da in meinem Skript der Code so untereinander steht, bin ich zuerst davon ausgegangen, die Funktion wird nicht/falsch eingebunden und der Aufruf erfolgt zu früh, währen die Funktion noch definiert wird. Daher habe ich die Funktion in ein separates Skript geschrieben und wollte dieses Skript durch dot-sourcing in das Haupt-Skript einbinden. In der ISE funktionierte wieder alles wunderbar, das normale Ausführen zeigte mir allerdings wieder nur das Shell-Fenster, als wenn es ewig laden/bearbeiten würde. Ich habe dann die Funktion händisch in die normale Shell eingegeben, um sie dort zu definieren. Der Aufruf der Funktion schlug danach aber immer noch fehl. Auch habe ich schon versucht, den Funktionsbereich der Funktion durch andere Weg auf global zu setzen, etwa durch das Präfix
Es hat jedenfalls bisher nichts geholfen; in der ISE funktioniert alles, die normale Ausführung scheitert. Als letzten Versuch habe ich die Funktion in einem Skript definiert, ein zweites Skript bestand nur aus dem Aufruf. Ich habe dann das Funktions-Skript normal (per Klick) ausgeführt, um die Funktion zu definieren. Die PowerShell öffnete sich kurz, schloß sich ohne Fehlermeldung. Bei der anschließenden Ausführung des zweiten Skripts bekomme ich den Fehler,
Vom dot-sourcing (also dem Auslagern der Funktion auf ein separates Skript) würde ich gern absehen, da ich, wie oben gesagt, mehrere verschiedene Funktionen nutze. In dem Fall würde ich dann zwei Skripts oder mehr benötigen, was ich der Einfachheit wegen vermeiden möchte. Es muss doch irgendwie möglich sein, mit Funktionen in Skripts zu arbeiten - ohne alles händisch vorher zu deklarieren oder für ein simples Vorhaben fünf Skripts zu benötigen. Was fehlt mir da?
Ich hoffe Ihr könnt mit den Informationen etwas anfangen.
Gruß Scriptex
Hallo zusammen!
Ich habe ein Skript, in dem der User zwei Dateien auswählen (öffnen), einen Speicherort bestimmen und etwas bestätigen/auswählen soll. Diese Aufgaben würde ich gern Anwender-freundlich mit ein paar GUIs lösen. Der Benutzer wählt und klickt, das Skript läuft im Hintergrund ab.
Die GUIs sollen dabei durch Funktionen aufgerufen werden. Da ich sowohl ein "Datei öffnen"-Fenster, ein "Speichern unter"-Fenster und eine Sicherheitsabfrage in dem Skript nutzen will, muss ich verschiedene Funktionen nutzen.
Nun zum Problem:
Führe ich das Skript in der ISE aus, läuft alles einwandfrei ab; die Fenster öffnen sich. Starte ich das Skript mit der normalen Powershell per Klick (also so, wie es im Endeffekt auch geschehen wird) geht bloß das Shellfenster auf, der Cursor blinkt. Wie ich herausgefunden habe, liegt das Problem scheinbar beim Aufurf der Funktion durch
Select-FileDialog
. Die Codes sehen so aus:Einbindung der Funktion
Function Select-FileDialog
{
param([string]$Title)
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
$objForm = New-Object System.Windows.Forms.OpenFileDialog
$objForm.InitialDirectory = "C:\"
$objForm.Filter = "TXT-Dateien (*.txt)|*.txt"
$objForm.Title = $Title
$objForm.ShowDialog()
}
Aufruf
$path_txt1 = Select-FileDialog -Title "Auswahl Datei"
Da in meinem Skript der Code so untereinander steht, bin ich zuerst davon ausgegangen, die Funktion wird nicht/falsch eingebunden und der Aufruf erfolgt zu früh, währen die Funktion noch definiert wird. Daher habe ich die Funktion in ein separates Skript geschrieben und wollte dieses Skript durch dot-sourcing in das Haupt-Skript einbinden. In der ISE funktionierte wieder alles wunderbar, das normale Ausführen zeigte mir allerdings wieder nur das Shell-Fenster, als wenn es ewig laden/bearbeiten würde. Ich habe dann die Funktion händisch in die normale Shell eingegeben, um sie dort zu definieren. Der Aufruf der Funktion schlug danach aber immer noch fehl. Auch habe ich schon versucht, den Funktionsbereich der Funktion durch andere Weg auf global zu setzen, etwa durch das Präfix
global:
vor dem Funktionsname in der Funktion (stand so als Tipp bei den Scripting Guys).Es hat jedenfalls bisher nichts geholfen; in der ISE funktioniert alles, die normale Ausführung scheitert. Als letzten Versuch habe ich die Funktion in einem Skript definiert, ein zweites Skript bestand nur aus dem Aufruf. Ich habe dann das Funktions-Skript normal (per Klick) ausgeführt, um die Funktion zu definieren. Die PowerShell öffnete sich kurz, schloß sich ohne Fehlermeldung. Bei der anschließenden Ausführung des zweiten Skripts bekomme ich den Fehler,
Select-FileDialog
sei nicht als Name einer Funktion, eines cmdlets, etc. gefunden worden. Warum wurde die Funktion also scheinbar nicht richtig eingebunden??Vom dot-sourcing (also dem Auslagern der Funktion auf ein separates Skript) würde ich gern absehen, da ich, wie oben gesagt, mehrere verschiedene Funktionen nutze. In dem Fall würde ich dann zwei Skripts oder mehr benötigen, was ich der Einfachheit wegen vermeiden möchte. Es muss doch irgendwie möglich sein, mit Funktionen in Skripts zu arbeiten - ohne alles händisch vorher zu deklarieren oder für ein simples Vorhaben fünf Skripts zu benötigen. Was fehlt mir da?
Ich hoffe Ihr könnt mit den Informationen etwas anfangen.
Gruß Scriptex
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 183688
Url: https://administrator.de/contentid/183688
Ausgedruckt am: 05.11.2024 um 14:11 Uhr
1 Kommentar