none
Kommandozeilentool nacheinander mit verschiedenen, von Powershell ermittelten Variablen füttern RRS feed

  • Frage

  • Hallo,

    eins vorweg: ich arbeite mich gerade in Powershell ein, also bitte nicht über meine Frage lachen ;)

    Ich habe ein Kommandozeilentool mit dem ich MXF-Dateien wrappen kann. Mit Powershell3.0 habe ich mir eine GUI gebaut, die zum einen einen OpenFileDialog zum auswählen der zu wrappenden Dateien beinhaltet und zum anderen mittels eines FolderBrowserDialogs den Benutzer das Zielverzeichnis wählen lässt.

    Das Problem ist, dass bei der Auswahl von mehreren Dateien eigentlich das Kommandozeilentool in der Anzahl der ausgewählten Dateien angesprochen werden müsste, da innerhalb des Tools meines Wissens keine Art Queue vorgesehen ist. Mittels "System.Windows.Forms.OpenFileDialog.FileNames" kann ich Prolemlos mehrere Dateien zum Tool übergeben, aber mit dem Erstellen mehrerer Starts des Tools komme ich nicht zurecht.

    Eventuell habt Ihr einen Tipp für mich?

    Viele Grüße


    • Bearbeitet mqlmann Sonntag, 6. Oktober 2013 18:29
    Sonntag, 6. Oktober 2013 18:28

Antworten

  • Das ist eigentlich ganz einfach!

    In dem Ergebnis von OpenFileDialog.FileNames hast du ja eine Liste (ein Array).

    Jedes einzelne element einer Liste kannst du mit der ForEach Schleife abarbeiten.

    Pseudo code:

    ForEach($FileName in OpenFileDialog.FileNames) {
       # tue was mit dem Filename hier!
       Explorer.exe $FileName
    }

    Lies dir mal die Dokumentation zur ForEach Schleife durch:

    Get-Help about_ForEach

    oder http://www.colorconsole.de/PS_Windows/de/about_Foreach.htm

    Es gibt in der PowerShell 2 verschiedene ForEach Konstrukte!

    lies dir dazu auch mal meinen Artikel dazu durch:

    http://www.admin-source.de/BlogDeu/905/powershell-foreach-und-foreach-object


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Montag, 7. Oktober 2013 06:13
  • Anscheinend  hast du die ForEach Schleife nicht verstanden, dort musst du nicht wissen wie viele Dateien ein User ausgewählt hat!

    oder wir reden hier aneinander vorbei.

    Ich habe hier mal Beispiel Code erstellt. Probiere den mal aus!

    Das wesentliche steht in dem scriptblock $handler_btnOpenFile_Click :

    # Assemblies laden
    $Null = [reflection.assembly]::loadwithpartialname("System.Windows.Forms")
    
    # Form Objekte erstellen
    $frmMain = New-Object System.Windows.Forms.Form
    $btnOpenFile = New-Object System.Windows.Forms.Button
    $openFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog
    
    # Code für das Click Event des Buttons
    $handler_btnOpenFile_Click= 
    {
    #TODO: Place custom script here
    	$openFileDialog1.ShowDialog()
    	ForEach($File in $openFileDialog1.FileNames) {
    		[System.Windows.Forms.MessageBox]::Show("Ich verarbeite nun die Datei`n$File","DateiVerarbeitung")
    	}
    }
    # Controls einrichten
    $btnOpenFile.Location = "12,12"
    $btnOpenFile.Size = "75,23"
    $btnOpenFile.Text = "Open File"
    #$btnOpenFile.UseVisualStyleBackColor = $True
    $btnOpenFile.add_Click($handler_btnOpenFile_Click)
    
    $frmMain.StartPosition = "CenterScreen"
    $frmMain.ClientSize = "116,53"
    $frmMain.Controls.Add($btnOpenFile)
    
    $openFileDialog1.Multiselect = $True
    $openFileDialog1.ShowHelp = $True
    
    #Form Anzeigen
    $Null = $frmMain.ShowDialog()

    Die Anzahl der ausgewählten dateien bekommst du ganz einfach mit der Zeile :

    $openFileDialog1.FileNames.Count


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Mittwoch, 9. Oktober 2013 06:07

Alle Antworten

  • Das ist eigentlich ganz einfach!

    In dem Ergebnis von OpenFileDialog.FileNames hast du ja eine Liste (ein Array).

    Jedes einzelne element einer Liste kannst du mit der ForEach Schleife abarbeiten.

    Pseudo code:

    ForEach($FileName in OpenFileDialog.FileNames) {
       # tue was mit dem Filename hier!
       Explorer.exe $FileName
    }

    Lies dir mal die Dokumentation zur ForEach Schleife durch:

    Get-Help about_ForEach

    oder http://www.colorconsole.de/PS_Windows/de/about_Foreach.htm

    Es gibt in der PowerShell 2 verschiedene ForEach Konstrukte!

    lies dir dazu auch mal meinen Artikel dazu durch:

    http://www.admin-source.de/BlogDeu/905/powershell-foreach-und-foreach-object


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Montag, 7. Oktober 2013 06:13
  • Hallo Peter,

    herzlichen Dank für Deine schnelle Antwort. Ich werde das heute oder morgen gleich versuchen.

    Viele Grüße

    Montag, 7. Oktober 2013 19:14
  • Hallo Peter,

    nach einigen Tests und Kopfzermarterns meinerseits muss ich doch noch eine Frage loswerden. Das Starten des Tools in mehreren, eigenen Prozessen mittels der forEach Schleife funktioniert erstmal. Allerdings muss ich in meinem Tool innerhalb der Kommandozeile die Files mitsamt Pfad als Input angeben. Diese Information lese ich ebenfalls mit "$DateiAuswahl.FileNames" aus. Bei starten des Tools mit einzelnen Files und "$DateiAuswahl.FileNames" als Input klappt auch alles.

    Aber wie kann ich es bewerkstelligen, dass jeder Start meines Kommandozeilentools als Input das nächste File mitsamt Pfad bekommt?

    Kann ich denn die Files im "$DateiAuswahl.FileNames"-Array eventuell mit Variablen versehen und diese dann als Input verwenden? Und falls das wiederum funktionieren sollte, wie gehe ich mit der Problematik um, dass ich nie wissen kann, ob 5, 10 oder 700 Files vom User ausgewählt werden?

    Vielen Dank im Voraus!

      Johannes

    Dienstag, 8. Oktober 2013 21:02
  • Anscheinend  hast du die ForEach Schleife nicht verstanden, dort musst du nicht wissen wie viele Dateien ein User ausgewählt hat!

    oder wir reden hier aneinander vorbei.

    Ich habe hier mal Beispiel Code erstellt. Probiere den mal aus!

    Das wesentliche steht in dem scriptblock $handler_btnOpenFile_Click :

    # Assemblies laden
    $Null = [reflection.assembly]::loadwithpartialname("System.Windows.Forms")
    
    # Form Objekte erstellen
    $frmMain = New-Object System.Windows.Forms.Form
    $btnOpenFile = New-Object System.Windows.Forms.Button
    $openFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog
    
    # Code für das Click Event des Buttons
    $handler_btnOpenFile_Click= 
    {
    #TODO: Place custom script here
    	$openFileDialog1.ShowDialog()
    	ForEach($File in $openFileDialog1.FileNames) {
    		[System.Windows.Forms.MessageBox]::Show("Ich verarbeite nun die Datei`n$File","DateiVerarbeitung")
    	}
    }
    # Controls einrichten
    $btnOpenFile.Location = "12,12"
    $btnOpenFile.Size = "75,23"
    $btnOpenFile.Text = "Open File"
    #$btnOpenFile.UseVisualStyleBackColor = $True
    $btnOpenFile.add_Click($handler_btnOpenFile_Click)
    
    $frmMain.StartPosition = "CenterScreen"
    $frmMain.ClientSize = "116,53"
    $frmMain.Controls.Add($btnOpenFile)
    
    $openFileDialog1.Multiselect = $True
    $openFileDialog1.ShowHelp = $True
    
    #Form Anzeigen
    $Null = $frmMain.ShowDialog()

    Die Anzahl der ausgewählten dateien bekommst du ganz einfach mit der Zeile :

    $openFileDialog1.FileNames.Count


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Mittwoch, 9. Oktober 2013 06:07