none
Exception durch fehlenden Pfad bei FileDialog RRS feed

  • Frage

  • Hallo!

    Ich verwende eine Filedialog. Wenn ich die Datei öffne ist alles soweit ok, wenn ich jedoch keine Datei auswähle, möchte ich diese Exception einfach abfangen

    Dabei ist der Dialog wie folgt implementiert:

    function Select-FileDialog
    {
    	param([string]$Title,[string]$Directory,[string]$Filter="All Files (*.*)|*.*")
    	[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
    	$objForm = New-Object System.Windows.Forms.OpenFileDialog
    	$objForm.InitialDirectory = $Directory
    	$objForm.Filter = $Filter
    	$objForm.Title = $Title
    	$Show = $objForm.ShowDialog()
    	If ($Show -eq "OK")
    	{
    		Return $objForm.FileName
    	}
    	Else
    	{
    		Write-Error "Operation cancelled by user."
    		return "";
    	}
    }

    Nun wollte ich ich diesen Pfad wie folgt verwenden

    $FileChoseButton.Add_Click({
    try {
    $file=Select-FileDialog -Title "Select a file" -Directory "H:\tmp-logs" 
    }catch [Exception] {
     return $_.Exception.Message
    }

    Aber wenn ich den Cancel-Button im Filedialog drückke entsteht eine Fehlermeldung:

    Select-FileDialog : Operation cancelled by user.
    Bei D:\projekte\getAuftragsnummer.ps1:80 Zeichen:24
    + $file=Select-FileDialog <<<<  -Title "Select a file" -Directory "H:\tmp-logs" 
        + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
        + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Select-FileDialog

    Wie kann ich diese Meldung abfangen bzw. vermeiden. Mit einem Try-Catch-Block habe ich es bisher nicht geschafft.

    Danke und Gruß

    niesel

    Freitag, 24. August 2012 13:12

Antworten

  • Schöne Frage! Hab ich mich doch auch erst vom Filedialog ablenken lassen...

    Kurze Antwort: Du erzeugst den Fehler selbst! Absichtlich.

    Gib mal folgendes:
     

    Write-Error "Operation cancelled by user."

     
    alleine in den Editor/Konsole ein. Das erzeugt die von dir beanstandete Fehlermeldung. Powershell macht also genau das was du (unbeabsichtigt) gewünscht hast. :)

    Mache aus write-error einfach ein write-host z.b. und der Fehler ist weg.Lies auch mal hier (LINK).

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Freitag, 24. August 2012 14:51
    Moderator
  • In der Funktion Select-Filedialog hast du in dem ELSE die Anweisung drin: Write-Error "Operation cancelled by user." !

    Lass diese Anweisung einfach weg, schon kommt keine Fehlermeldung mehr!

    function Select-FileDialog
    {
    	param([string]$Title,[string]$Directory,[string]$Filter="All Files (*.*)|*.*")
    	[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
    	$objForm = New-Object System.Windows.Forms.OpenFileDialog
    	$objForm.InitialDirectory = $Directory
    	$objForm.Filter = $Filter
    	$objForm.Title = $Title
    	$Show = $objForm.ShowDialog()
    	If ($Show -eq "OK")
    	{
    		Return $objForm.FileName
    	}
    }

    In deinem Button Click handler $FileChoseButton.Add_Click tust du dann nur etwas wenn auch eine Datei ausgewählt wurde.
    Das kannst du einfach Abfragen, in dem du schaust ob in der Variablen $file auch was drin ist (länge ist grösser als 0)
    Wenn keine Dateiausgewählt wurde tut den Programm einfach NIX!

    $file=Select-FileDialog -Title "Select a file" -Directory "H:\tmp-logs"
    If ($file.Length -gt 0 ) { # Datei wurde ausgesucht! Und hier kannst du mit der Datei was machen Write-Host $file } Else { # keine Datei ausgewählt! Nix zu tun ! }


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Freitag, 24. August 2012 14:51

Alle Antworten

  • Versuch mal folgendes:

    If($openFileDialog1.ShowDialog() -eq [Windows.Forms.DialogResult]::Ok){Write-Host "Mache das"}

    Freitag, 24. August 2012 13:17
  • das wird nicht funktionieren, da ich den Filedialog durch die Funktion  erzeugen lasse Select-FileDialog und ich somit in der "Main" kein Zugriff auf das Objekt

    openFileDialog1 

    habe


    Grüße
    • Bearbeitet nieselfriem Freitag, 24. August 2012 13:28
    Freitag, 24. August 2012 13:27
  • Schöne Frage! Hab ich mich doch auch erst vom Filedialog ablenken lassen...

    Kurze Antwort: Du erzeugst den Fehler selbst! Absichtlich.

    Gib mal folgendes:
     

    Write-Error "Operation cancelled by user."

     
    alleine in den Editor/Konsole ein. Das erzeugt die von dir beanstandete Fehlermeldung. Powershell macht also genau das was du (unbeabsichtigt) gewünscht hast. :)

    Mache aus write-error einfach ein write-host z.b. und der Fehler ist weg.Lies auch mal hier (LINK).

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Freitag, 24. August 2012 14:51
    Moderator
  • In der Funktion Select-Filedialog hast du in dem ELSE die Anweisung drin: Write-Error "Operation cancelled by user." !

    Lass diese Anweisung einfach weg, schon kommt keine Fehlermeldung mehr!

    function Select-FileDialog
    {
    	param([string]$Title,[string]$Directory,[string]$Filter="All Files (*.*)|*.*")
    	[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
    	$objForm = New-Object System.Windows.Forms.OpenFileDialog
    	$objForm.InitialDirectory = $Directory
    	$objForm.Filter = $Filter
    	$objForm.Title = $Title
    	$Show = $objForm.ShowDialog()
    	If ($Show -eq "OK")
    	{
    		Return $objForm.FileName
    	}
    }

    In deinem Button Click handler $FileChoseButton.Add_Click tust du dann nur etwas wenn auch eine Datei ausgewählt wurde.
    Das kannst du einfach Abfragen, in dem du schaust ob in der Variablen $file auch was drin ist (länge ist grösser als 0)
    Wenn keine Dateiausgewählt wurde tut den Programm einfach NIX!

    $file=Select-FileDialog -Title "Select a file" -Directory "H:\tmp-logs"
    If ($file.Length -gt 0 ) { # Datei wurde ausgesucht! Und hier kannst du mit der Datei was machen Write-Host $file } Else { # keine Datei ausgewählt! Nix zu tun ! }


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Freitag, 24. August 2012 14:51
  • Du kannst jederzeit auch innerhalb einer Funktion Variablen und Objekte erzeugen, auf die du auch von "ausserhalb" zugriff hast.

    Schau die mal hierzu die Powershell-Hilfe über Scopes an: LINK (oder tippe "get-help about_scopes" in die Konsole ein)

    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Freitag, 24. August 2012 14:56
    Moderator
  • Hallo!

    Wie kann ich aus dem file-Objekt, was ich über den Filedialog eerstellt habe den Dateipfad auslesen

    $file=Select-FileDialog -Title "Select a file" 

    wie z.B. in Java file.getAbsolutePath()); o.Ä.

    Grüße niesel

    Montag, 27. August 2012 07:34
  • Die Antwort habe ich dir schon geschrieben!
    Sieh mal in deiner ersten Frage! Dort steht die Antwort!

    http://social.technet.microsoft.com/Forums/de-DE/powershell_de/thread/2be1354f-0da3-4327-8914-4d63818f08bb

    Du behandelst die Windows Forms events auch etwas umständlich! Das macht die Sache noch komplizierter!
    Schau dir dazu mal mein Video auf YouTube an! Da wird genau das, auf eine etwas andere Art, gezeigt!
    http://youtu.be/y76LO5VIN24

    Komplettes Beispiel mit Kommentaren:

    #----------------------------------------------
    # #Windows Forms Assemblies in den Speicher laden
    #----------------------------------------------
    [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
    [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
    
    #----------------------------------------------
    # Die Windows Form Objekte erstellen
    #----------------------------------------------
    $form1 = New-Object System.Windows.Forms.Form # Das Objekt das das Hauptfenser darstellt
    $ButtonOpenFile = New-Object System.Windows.Forms.Button # Das Objekt das den Dateiöffne Button darstellt
    $openFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog # Das Objekt das den Dateiöffnen Dialog darstellt
    $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState # Das Objekt wird zum Initialisieren der Form benötigt
    
    #----------------------------------------------
    # hier werden die Ereignisse der Windows Forms behandelt
    #----------------------------------------------
    
    # hier wird das click Ereignis des Buttons behandelt
    $handler_ButtonOpenFile_Click= 
    {
        # Anzeigen des OpenFile Dialogs
        
        $DialogResult = $openFileDialog1.ShowDialog()
        
        # in dialog result steht dann das ergebniss $DialogResult 
        #$DialogResult ist vom :NET-Typ: System.Windows.Forms.DialogResult
        #Dialoge haben fast alle eine OK- und eine Abbrechen-Schaltfläche, manche haben auch noch Wiederholen- und/oder Ignorieren-Schaltflächen.
        #$DialogResult enthält das Ergebnis ob der Benutzer OK geklickt hat – oder die Abbrechen-Schaltfläche - oder Ignorieren - oder..... 
        #$DialogResult kann folgende Werte annehmen:
        #
        #None = Nothing wird vom Dialogfeld zurückgegeben.Dies bedeutet, dass das modale Dialogfeld weiterhin ausgeführt wird.
        #OK = Der Rückgabewert des Dialogfelds ist OK (üblicherweise von der Schaltfläche OK gesendet).
        #Cancel = Der Rückgabewert des Dialogfelds ist Cancel (üblicherweise von der Schaltfläche Abbrechen gesendet).
        #Abort = Der Rückgabewert des Dialogfelds ist Abort (üblicherweise von der Schaltfläche Abbrechen gesendet).
        #Retry = Der Rückgabewert des Dialogfelds ist Retry (üblicherweise von der Schaltfläche Wiederholen gesendet).
        #Ignore = Der Rückgabewert des Dialogfelds ist Ignore (üblicherweise von der Schaltfläche Ignorieren gesendet).
        #Yes = Der Rückgabewert des Dialogfelds ist Yes (üblicherweise von der Schaltfläche Ja gesendet).
        #No = Der Rückgabewert des Dialogfelds ist No (üblicherweise von der Schaltfläche Nein gesendet).
        
        
        # Prüfen ob der User eine Datei ausgewählt hat
        # Das kann man einfach Abfragen, in dem man schaut, ob in $openFileDialog1.Filename auch ein String enthalten ist (die des Strings ist grösser als 0)
        If ($openFileDialog1.Filename.Length -gt 0 ) {
            # Eine Datei wurde ausgesucht! Und hier kannst du mit der Datei was machen
            # Powershell zeigt mit Write-Host den Dateinamen aus dem Openfile Dialog an
            Write-Host $openFileDialog1.Filename
            
            # Ausgewählte Datei in einer MessageBox anzeigen
            [System.Windows.Forms.MessageBox]::Show($openFileDialog1.Filename)
        }
        Else
        {
            # keine Datei ausgewählt! Nix zu tun !
            Write-Host "Der user hat keine Datei ausgewählt!"
            Write-Host "Der user hat $DialogResult angeklickt!"
        }
         
    }
    
    $OnLoadForm_StateCorrection=
    {#Correct the initial state of the form to prevent the .Net maximized form issue
    	$form1.WindowState = $InitialFormWindowState
    }
    
    #---------------------------------------------------------------------------------
    
    
    #----------------------------------------------
    # Die Windows Form Objekte einrichten (Höhe,Breite,Positon,Text usw...)
    #----------------------------------------------
    # Die Windows Form einrichten
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Height = 255
    $System_Drawing_Size.Width = 282
    $form1.ClientSize = $System_Drawing_Size
    $form1.DataBindings.DefaultDataSourceUpdateMode = 0
    $form1.Name = "form1"
    $form1.Text = "Primal Form"
    
    # Den ButtonOpenFile einrichten 
    $ButtonOpenFile.DataBindings.DefaultDataSourceUpdateMode = 0
    
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 28
    $System_Drawing_Point.Y = 58
    $ButtonOpenFile.Location = $System_Drawing_Point
    $ButtonOpenFile.Name = "button1"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Height = 23
    $System_Drawing_Size.Width = 150
    $ButtonOpenFile.Size = $System_Drawing_Size
    $ButtonOpenFile.TabIndex = 0
    $ButtonOpenFile.Text = "Datei Dialog"
    $ButtonOpenFile.UseVisualStyleBackColor = $True
    
    # Das $ButtonOpenFile click event wird mit der Function $handler_ButtonOpenFile_Click verbunden
    # $handler_ButtonOpenFile_Click wird dann aufgerufen wenn der Button geclickt wird
    $ButtonOpenFile.add_Click($handler_ButtonOpenFile_Click)
    
    # Den Button ButtonOpenFile zu der Windows Form hinzufügen
    $form1.Controls.Add($ButtonOpenFile)
    
    # Den open File Dialog einrichten
    $openFileDialog1.FileName = "openFileDialog1"
    $openFileDialog1.ShowHelp = $True
    
    #----------------------------------------------
    # Die Windows Form wird initialisiert
    #----------------------------------------------
    $InitialFormWindowState = $form1.WindowState
    #Init the OnLoad event to correct the initial state of the form
    $form1.add_Load($OnLoadForm_StateCorrection)
    
    #----------------------------------------------
    # Die Windows Form wird als Dialog Modal angezeigt
    #----------------------------------------------
    $form1.ShowDialog()| Out-Null


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Montag, 27. August 2012 09:52
  • Gut kommentiertes Beispiel Peter! Nur die ganzen Drawing-Size und -Point Objekte kann man sich komplett sparen.

    Um ein Winforms-objekt zu dimensionieren und positionieren, reicht völlig:


    $ButtonOpenFile.Location = "28, 58"
    $ButtonOpenFile.Size = "150, 23"

     

    Grüße, Denniver



    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 27. August 2012 12:06
    Moderator
  • Ich habs ja nicht geschrieben ! War PrimalForms ;-)

    Dann halt so (menno...):
    #----------------------------------------------
    # #Windows Forms Assemblies in den Speicher laden
    #----------------------------------------------
    [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
    [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
    
    #----------------------------------------------
    # Die Windows Form Objekte erstellen
    #----------------------------------------------
    $form1 = New-Object System.Windows.Forms.Form # Das Objekt, dass das Hauptfenser darstellt
    $ButtonOpenFile = New-Object System.Windows.Forms.Button # Das Objekt, dass den Dateiöffnen Button darstellt
    $openFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog # Das Objekt, dass den Dateiöffnen Dialog darstellt
    $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState # Das Objekt wird zum Initialisieren der Form benötigt
    
    #----------------------------------------------
    # hier werden die Ereignisse der Windows Forms behandelt
    #----------------------------------------------
    
    # hier wird das click Ereignis des Buttons behandelt
    $handler_ButtonOpenFile_Click= 
    {
        # Anzeigen des OpenFile Dialogs
        
        $DialogResult = $openFileDialog1.ShowDialog()
        
        # in dialog result steht dann das ergebniss $DialogResult 
        #$DialogResult ist vom :NET-Typ: System.Windows.Forms.DialogResult
        #Dialoge haben fast alle eine OK- und eine Abbrechen-Schaltfläche, manche haben auch noch Wiederholen- und/oder Ignorieren-Schaltflächen.
        #$DialogResult enthält das Ergebnis ob der Benutzer OK geklickt hat – oder die Abbrechen-Schaltfläche - oder Ignorieren - oder..... 
        #$DialogResult kann folgende Werte annehmen:
        #
        #None = Nothing wird vom Dialogfeld zurückgegeben.Dies bedeutet, dass das modale Dialogfeld weiterhin ausgeführt wird.
        #OK = Der Rückgabewert des Dialogfelds ist OK (üblicherweise von der Schaltfläche OK gesendet).
        #Cancel = Der Rückgabewert des Dialogfelds ist Cancel (üblicherweise von der Schaltfläche Abbrechen gesendet).
        #Abort = Der Rückgabewert des Dialogfelds ist Abort (üblicherweise von der Schaltfläche Abbrechen gesendet).
        #Retry = Der Rückgabewert des Dialogfelds ist Retry (üblicherweise von der Schaltfläche Wiederholen gesendet).
        #Ignore = Der Rückgabewert des Dialogfelds ist Ignore (üblicherweise von der Schaltfläche Ignorieren gesendet).
        #Yes = Der Rückgabewert des Dialogfelds ist Yes (üblicherweise von der Schaltfläche Ja gesendet).
        #No = Der Rückgabewert des Dialogfelds ist No (üblicherweise von der Schaltfläche Nein gesendet).
        
        
        If ($openFileDialog1.Filename.Length -gt 0 ) {
            # Eine Datei wurde ausgesucht! Und hier kannst du mit der Datei was machen
            # Powershell zeigt mit Write-Host den Dateinamen aus dem Openfile Dialog an
            Write-Host $openFileDialog1.Filename
            
            # Ausgewählte Datei in einer MessageBox anzeigen
            [System.Windows.Forms.MessageBox]::Show($openFileDialog1.Filename)
        }
        Else
        {
            # keine Datei ausgewählt! Hier ist eigentlich Nix zu tun !
    		# zu Demonstration geben wir das $DialogResult aus!
            Write-Host "Der user hat keine Datei ausgewählt!"
            Write-Host "Der user hat $DialogResult angeklickt!"
        }
         
    }
    
    #---------------------------------------------------------------------------------
    #---------------------------------------------------------------------------------
    
    $OnLoadForm_StateCorrection=
    {# Korektur für den .NET Bug maximized form
    	$form1.WindowState = $InitialFormWindowState
    }
    
    #----------------------------------------------
    # Die Windows Form Objekte einrichten (Höhe,Breite,Positon,Text usw...)
    #----------------------------------------------
    # Die Windows Form einrichten
    $form1.ClientSize = "282,255"
    $form1.DataBindings.DefaultDataSourceUpdateMode = 0
    $form1.Name = "form1"
    $form1.Text = "Primal Form"
    
    # Den ButtonOpenFile einrichten 
    $ButtonOpenFile.DataBindings.DefaultDataSourceUpdateMode = 0
    $ButtonOpenFile.Location = "28,58" 
    $ButtonOpenFile.Name = "button1"
    $ButtonOpenFile.Size = "150, 23"
    $ButtonOpenFile.TabIndex = 0
    $ButtonOpenFile.Text = "Datei Dialog"
    $ButtonOpenFile.UseVisualStyleBackColor = $True
    
    # Das $ButtonOpenFile click event wird mit der Function $handler_ButtonOpenFile_Click verbunden
    # $handler_ButtonOpenFile_Click wird dann aufgerufen wenn der Button geclickt wird
    $ButtonOpenFile.add_Click($handler_ButtonOpenFile_Click)
    
    # Den Button ButtonOpenFile zu der Windows Form hinzufügen
    $form1.Controls.Add($ButtonOpenFile)
    
    # Den open File Dialog einrichten
    $openFileDialog1.FileName = "openFileDialog1"
    $openFileDialog1.ShowHelp = $True
    
    #----------------------------------------------
    # Die Windows Form wird initialisiert
    #----------------------------------------------
    $InitialFormWindowState = $form1.WindowState
    #Init the OnLoad event to correct the initial state of the form
    $form1.add_Load($OnLoadForm_StateCorrection)
    
    #----------------------------------------------
    # Die Windows Form wird als Dialog Modal angezeigt
    #----------------------------------------------
    $form1.ShowDialog()| Out-Null


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Montag, 27. August 2012 13:06