Die sicherste Möglichkeit, eine BAT-Datei über ein Powershell-Skript auszuführen


76

Ich kann kein Powershell-Skript zum direkten Ausführen einer Bat-Datei erhalten. Dies funktioniert beispielsweise in der Befehlszeile:

.\\my-app\my-fle.bat

Wenn ich diesen Befehl zu einem Skript hinzufüge, wird Folgendes ausgegeben:

The term '.\\my-app\my-file.bat' is not recognized as the 
name of a cmdlet, function, script file, or operable program. 
Check the spelling of the name, or if a path was included, 
verify that the path is correct and try again.

Ich habe auch folgendes versucht, mit dem gleichen Ergebnis:

& .\\my-app\my-fle.bat
& ".\\my-app\my-fle.bat"
\my-app\my-fle.bat
& \my-app\my-fle.bat
& "\my-app\my-fle.bat"

Hinweis: Es muss den letzten Code zurückgeben, da ich den Erfolg des Stapels überprüfen muss.


Zwei Backslashes geben eine Serverfreigabe an.
js2010

Antworten:



34

Um die .bat-Datei auszuführen und Zugriff auf den letzten Exit-Code zu erhalten, führen Sie sie wie folgt aus:

 & .\my-app\my-fle.bat

Das funktioniert nur, wenn my-appes sich im relativen Pfad befindet oder ich den Laufwerksbuchstaben verwende. Ich habe versucht zu vermeiden, dass das Skript an ein bestimmtes Laufwerk gebunden ist.
cmcginty

1
@Casey Ich denke ich habe falsch verstanden. Befindet my-appsich ein Ordner im Stammverzeichnis des Laufwerks, mit dem Sie arbeiten? Wenn ja, & \my-app\my-file.batfunktioniert für mich. Wie ruft man das .ps1-Skript auf?
Rynant

26

Versuchen Sie dies, Ihre Punktquelle war ein wenig aus. Bearbeiten, Lastexitcode-Bits für OP hinzufügen.

$A = Start-Process -FilePath .\my-app\my-fle.bat -Wait -passthru;$a.ExitCode

-WindowStyle Hiddenfür unsichtbare Charge hinzufügen .


Das hat funktioniert. Gibt dies auch den Exit-Status in LastExitCode zurück?
cmcginty

Um vom Startvorgang an auf $ lastexitcode zuzugreifen, müssen Sie den Befehl einer Variablen zuordnen, den Durchgangsschalter verwenden und dann den Exitcode aus der Variablen lesen.
Knöchel-Dragger

1

Angenommen, my-app ist ein Unterverzeichnis unter dem aktuellen Verzeichnis. Der $ LASTEXITCODE sollte ab dem letzten Befehl vorhanden sein:

.\my-app\my-fle.bat

Wenn es von einem Fileshare war:

\\server\my-file.bat

0

Die Lösung von @Rynant hat bei mir funktioniert. Ich hatte jedoch ein paar zusätzliche Anforderungen:

  1. PAUSE nicht, wenn es in der Bat-Datei vorkommt
  2. Optional können Sie die Ausgabe der Bat-Datei an die Protokolldatei anhängen

Folgendes habe ich (endlich) zum Arbeiten gebracht:

[PS-Skriptcode]

& runner.bat bat_to_run.bat logfile.txt

[Runner.bat]

@echo OFF

REM This script can be executed from within a powershell script so that the bat file
REM passed as %1 will not cause execution to halt if PAUSE is encountered.
REM If {logfile} is included, bat file output will be appended to logfile.
REM
REM Usage:
REM runner.bat [path of bat script to execute] {logfile}

if not [%2] == [] GOTO APPEND_OUTPUT
@echo | call %1
GOTO EXIT

:APPEND_OUTPUT
@echo | call %1  1> %2 2>&1

:EXIT
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.