none
Mehrere Parameter an Batch-Datei durchschleifen

    Frage

  • Ich rufe eine PowerShell-Datei mit Parametern auf:

    powershell.exe C:\framework\run.ps1 param1 param2:0001
    powershell.exe C:\framework\run.ps1 param1 param2 param3:0002

    Mit diesen Parametern soll aus dem PS-Skript aus sofort eine Batch-Datei gestartet werden. Das PowerShell-Skript soll auf die Ausführung der Batch-Datei warten. Leider bin ich bisher gescheitert:

    $stringForBatch = $PSScriptRoot + "\run.bat"
    Start-Process -FilePath $stringForBatch -ArgumentList $args -Wait -WindowStyle Maximized

    Also in etwa:

    c:\framework\run.bat param1 param2:0001

    Was mache ich falsch?


    • Bearbeitet it.SOLUTIX Freitag, 29. Juni 2018 22:17
    Freitag, 29. Juni 2018 22:16

Antworten

  • Siehste ... ich Dussel ...  einmal nicht aufgepasst ...  in meiner ersten Antwort hatte ich noch dran gedacht ... als erstes Argument musst Du "/C" angeben, damit die übergebene Script-Datei auch gestartet wird. Wenn der Rest soweit passt dann also so:
    Start-Process -FilePath $env:ComSpec -ArgumentList "/C $stringForBatch $args" -NoNewWindow -Wait -WorkingDirectory $PSScriptRoot
    ... probier ma!  ;-)

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Samstag, 30. Juni 2018 22:38

Alle Antworten

  • Warum möchtest Du denn aus einem "Kommandozeileninterface" (Powershell) ein anderes "Kommandozeileninterface" (CMD/Batch) aufrufen? Also warum überhaupt Batch? Seit Powershell gibt es eigentlich kaum noch einen Grund mehr Batchdateien zu benutzen.

    Wenn es unbedingt eine Batchdatei sein muss, sollte der korrekte Aufruf ungefähr so aussehen:

    Start-Process -FilePath $env:ComSpec -ArgumentList "/C <Hier der Name der Batch-Datei inclusive Pfad> Arg1 Arg2 ..." -NoNewWindow -Wait

    Achja und ... willkommen im Deutschen Microsoft Powershell Forum.  ;-)


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH_666 Freitag, 29. Juni 2018 23:36
    Freitag, 29. Juni 2018 23:32
  • Längere Geschichte. Die Batch-Datei kommt von einem Drittprodukt, damit wird Java aufgerufen. Ich möchte die Batch-Datei nicht modifizieren, brauche aber die Parameter, damit ich selbst etwas damit anstellen kann. Deswegen lege ich einfach eine PowerShell-Datei in das Verzeichnis und rufe nicht mehr direkt die Batch-Datei auf.

    Den Aufruf habe ich ausprobiert. Allerdings ist doch in $args ein Array drin? Den müsste man doch erst in Form bringen, nicht wahr? So klappt es leider nicht:

    $stringForBatch = $PSScriptRoot + "\run.bat"
    echo $stringForBatch $args
    
    # Start-Process -FilePath $stringForBatch -ArgumentList $args -Wait -WindowStyle Maximized
    Start-Process -FilePath $env:ComSpec -ArgumentList $stringForBatch -NoNewWindow -Wait

    Ausgabe:

    C:\at-framework\run.bat

    documents

    sit:0003

    Samstag, 30. Juni 2018 08:03
  • Hmmm ... Du bräuchtest die Batch-Datei ja gar nicht anpassen. Du könntest ihre Funktionialität einfach nachbauen. Sind die übergebenen Argumente immer gleich oder willst Du die jedesmal anpassen? Wieviele sind es? In Powershell gibt man mehrere Parameter-Werte einfach durch Kommata getrennt an. Also so:
    $stringForBatch = $PSScriptRoot + "\run.bat"
    Start-Process -FilePath $env:ComSpec -ArgumentList $stringForBatch, Arg1, Arg2, Arg2 -NoNewWindow -Wait
    ... oder Du übergibts dn Batch-Datei-Pfad inclusive der Argumente komplett als einen quasi vorformatierten String. Also so:
    $stringForBatch = $PSScriptRoot + "\run.bat Arg1, Arg2, Arg2"
    Start-Process -FilePath $env:ComSpec -ArgumentList $stringForBatch -NoNewWindow -Wait
    Die Powershell als "Startrampe" für Batch-Datei zu benutzen, ist wie einen computergesteuerten Industrieroboter mit 6 Freiheitsgraden zu benutzen, um mit einem Hammer einen Nagel in die Wand zu kloppen.   ;-)  ...


    Best regards,

    (79,108,97,102|%{[char]$_})-join''




    • Bearbeitet BOfH_666 Samstag, 30. Juni 2018 18:48
    Samstag, 30. Juni 2018 08:18
  • Die run.bat ist komplex und startet ein Java-Framework, es geht also darum, dass man ein bestehendes Problem löst und nicht Drittkomponenten ersetzt.

    Die Anzahl der Argumente ist variabel. Ich mache aus dem Array nun einen Sting, ziemlich easy. Aber es startet trotzdem nicht :(

    Start-Process -FilePath $env:ComSpec -ArgumentList "$stringForBatch $args" -NoNewWindow -Wait -WorkingDirectory $PSScriptRoot

    Der Pfad zur run.bat sieht in der Konsole sehr gut aus. Aber es startet nicht die Batch ;(

    Samstag, 30. Juni 2018 20:31
  • Siehste ... ich Dussel ...  einmal nicht aufgepasst ...  in meiner ersten Antwort hatte ich noch dran gedacht ... als erstes Argument musst Du "/C" angeben, damit die übergebene Script-Datei auch gestartet wird. Wenn der Rest soweit passt dann also so:
    Start-Process -FilePath $env:ComSpec -ArgumentList "/C $stringForBatch $args" -NoNewWindow -Wait -WorkingDirectory $PSScriptRoot
    ... probier ma!  ;-)

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Samstag, 30. Juni 2018 22:38
  • Und zusätzlich daran denken, korrekt zu quoten, ansonsten fällst du auf die Nase, wenn das Verzeichnis mal ein Leerzeichen enthalten sollte:

    $BatFilePath = Join-Path -Path $PSScriptRoot -ChildPath 'run.bat'
    $Arguments = @{
        FilePath = $env:ComSpec
        ArgumentList = "/c `"$BatFilePath`" $args"
    }
    Start-Process @Arguments -Wait -NoNewWindow
    Sonntag, 1. Juli 2018 06:54
  • Danke für die Hilfe und die vielen Mühen. Ich habe das Skript soweit, dass es die Batch-Datei startet. Nachdem diese durchlaufen wurde, erscheint folgende Ausgabe:

    Interner Win32-Fehler "Ein an das System angeschlossenes Gerät funktioniert nicht" 0x1F beim Schreiben in den Ausgabepuffer der Konsole an der aklen Cursorposition. Wenden Sie sich an Microsoft Customer Support Services.

    Das führt dazu, dass ich einen falschen ExitCode bekomme. Woran kann das liegen?

    Sonntag, 1. Juli 2018 18:42
  • > Interner Win32-Fehler "Ein an das System angeschlossenes Gerät funktioniert nicht" 0x1F beim Schreiben in den Ausgabepuffer der Konsole an der aklen Cursorposition. Wenden Sie sich an Microsoft Customer Support Services.

    Probier's mal ohne -NoNewWindow

    Montag, 2. Juli 2018 13:48