Return-Value eines PS-Scripts in einer Batch-Datei auswerten
Hallo,
ich bin neu, verzeiht mir also bitte Anfangsfehler! Es wäre schön, wenn Ihr mich dann konstruktiv darauf aufmerksam machen könntet. Danke!
Seit einiger Zeit sitze ich an zwei Problemen, von denen ich eines nicht verstehe und beim zweiten nicht weiterkomme. Mein Ziel ist, aus einer Batch-Datei ein PowerShell-Script aufzurufen und ein Return-Wert dieses Scripts in der Batch auszuwerten.
Zunächst das PS-Script. Es funktioniert wie erwartet aus einer PowerShell heraus.
Kleiner Schönheitfehler: Aus einer PowerShell aufgerufen, wird nicht nur die jeweilige Meldung angezeigt, sondern auch darunter der Return-Wert. Kann man das verhindern?
Und hier die Batch-Datei, meine beiden Probleme habe ich mit Doppel-Sternchen gerahmt
Problem 1:
Die sternchen-gerahmte Zeile Powershell.exe -ExecutionPolicy Bypass -File %Path% %Silent% produziert den Fehler Der Befehl "Powershell" ist entweder falsch geschrieben oder konnte nicht gefunden werden" (s. erster Screenshot unten).
Bevor Ihr fragt: PowerShell ist vorhanden, liegt in PATH, kann aus einer Kommandozeile aufgerufen werden und wird auch, in einer anderen Batch-Datei, mit identischer Zeile korrekt aufgerufen. Das verstehe ich nicht!
Problem 2:
Die gleiche Meldung ergibt sich, wenn das Script über die Funktion psExec ausgeführt wird (s. zweiter Screenshot unten). Da das auch in der anderen Batch-Datei so ist, in der Problem #1 nicht auftritt, scheint das daran zu liegen, wie es dort aufgerufen wird. Ich weiß aber nicht, wo ich den Fehler mache.
Ziel der Funktion psExec ist, das PS-Script auszuführen, dessen Return-Code zu ermitteln und an die Batch zu übergeben. Kann mir jemand dabei helfen?
Danke für Eure Mühe und Hilfe.
ich bin neu, verzeiht mir also bitte Anfangsfehler! Es wäre schön, wenn Ihr mich dann konstruktiv darauf aufmerksam machen könntet. Danke!
Seit einiger Zeit sitze ich an zwei Problemen, von denen ich eines nicht verstehe und beim zweiten nicht weiterkomme. Mein Ziel ist, aus einer Batch-Datei ein PowerShell-Script aufzurufen und ein Return-Wert dieses Scripts in der Batch auszuwerten.
Zunächst das PS-Script. Es funktioniert wie erwartet aus einer PowerShell heraus.
Param(
[Parameter(Mandatory=$True)]
[String]$Arg1,
[String]$Arg2
)
function CheckSomething
{
Param(
[ValidatePattern('^([0-9])$')]
[String]$ToCheck
)
}
function DoSomething
{
begin {
}
process {
}
end {
}
}
try {
CheckSomething Arg1
}
catch {
Write-Warning "Error 1"
Return 1
}
try {
DoSomething Arg1
Write-Host Arg2
Return 0
}
catch {
Write-Warning "Error 2"
Return 2
}
Und hier die Batch-Datei, meine beiden Probleme habe ich mit Doppel-Sternchen gerahmt
@echo off
setlocal
set Path=%~f0
set Path=%Path:.bat=.ps1%
set Silent=
set RetValue=
rem do a lot
set Silent=true
rem do more
echo call in main
echo Params: FilePath: %Path%, SilentSW: %Silent%
echo Powershell call: Powershell.exe -ExecutionPolicy Bypass -File %Path% %Silent%
echo.
**Powershell.exe -ExecutionPolicy Bypass -File %Path% %Silent%**
echo.
echo psExec call: call :psExec %Path% %Silent% RetValue
echo.
call :psExec %Path% %Silent% RetValue
echo.
echo RetValue: %RetValue%
exit /b
:psExec <FilePath> <SilentSW> <RetValue>
echo call in function
echo Params: FilePath: %1, SilentSW: %2
echo.
echo Argument: `Powershell -ExecutionPolicy Bypass -File ^%1 ^%2`
echo.
for /F "usebackq tokens=1" %%i in (**`Powershell -ExecutionPolicy Bypass -File %1 %2`**) do set ReturnValue=%%i
set "%3=%ReturnValue%"
Goto:eof
Problem 1:
Die sternchen-gerahmte Zeile Powershell.exe -ExecutionPolicy Bypass -File %Path% %Silent% produziert den Fehler Der Befehl "Powershell" ist entweder falsch geschrieben oder konnte nicht gefunden werden" (s. erster Screenshot unten).
Bevor Ihr fragt: PowerShell ist vorhanden, liegt in PATH, kann aus einer Kommandozeile aufgerufen werden und wird auch, in einer anderen Batch-Datei, mit identischer Zeile korrekt aufgerufen. Das verstehe ich nicht!
Problem 2:
Die gleiche Meldung ergibt sich, wenn das Script über die Funktion psExec ausgeführt wird (s. zweiter Screenshot unten). Da das auch in der anderen Batch-Datei so ist, in der Problem #1 nicht auftritt, scheint das daran zu liegen, wie es dort aufgerufen wird. Ich weiß aber nicht, wo ich den Fehler mache.
Ziel der Funktion psExec ist, das PS-Script auszuführen, dessen Return-Code zu ermitteln und an die Batch zu übergeben. Kann mir jemand dabei helfen?
Danke für Eure Mühe und Hilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 671924
Url: https://administrator.de/forum/return-value-eines-ps-scripts-in-einer-batch-datei-auswerten-671924.html
Ausgedruckt am: 16.03.2025 um 10:03 Uhr
8 Kommentare
Neuester Kommentar
Moin.
Der Kardinalfehler ist in Zeile 3 deines Batch Scripts. "Path" ist eine vordefinierte Umgebungsvariable, die die Suchpfade für ausführbare Dateien enthält, für die du keinen Pfad angibst. Heißt, Powershell wird nicht gefunden, weil du diese Variable neu definiert/überschrieben hast. Nutze einen anderen Variablenname und prüfe welche der Probleme noch übrig bleiben.
Gruß
Steffen
Der Kardinalfehler ist in Zeile 3 deines Batch Scripts. "Path" ist eine vordefinierte Umgebungsvariable, die die Suchpfade für ausführbare Dateien enthält, für die du keinen Pfad angibst. Heißt, Powershell wird nicht gefunden, weil du diese Variable neu definiert/überschrieben hast. Nutze einen anderen Variablenname und prüfe welche der Probleme noch übrig bleiben.
Gruß
Steffen
Haha, ja hab ich gesehen.
Ich vermute zumindest dass du was in der Art versuchst ...
Gruß
Steffen
@echo off
setlocal
set "PSPath=%~dpn0.ps1"
REM set "Arg=0"
set "Arg=X"
set "Silent=whatever"
Powershell -ExecutionPolicy Bypass -File "%PSPath%" "%Arg%" "%Silent%"
set "ReturnValue=%errorlevel%"
echo(
echo ReturnValue: %ReturnValue%
pause
Param(
[Parameter(Mandatory=$True)]
[String]$Arg1,
[String]$Arg2
)
function CheckSomething
{
Param(
[ValidatePattern('^([0-9])$')]
[String]$ToCheck
)
}
function DoSomething
{
begin {
}
process {
}
end {
}
}
try {
CheckSomething $Arg1
}
catch {
Write-Warning "Error 1"
exit 1
}
try {
DoSomething $Arg1
Write-Host $Arg2
exit 0
}
catch {
Write-Warning "Error 2"
exit 2
}
Ich vermute zumindest dass du was in der Art versuchst ...
Gruß
Steffen
Naja, je mehr Sprachen mit ihrer eigenen Syntax du über mehrere Prozesse hinweg verschachtelst, um so komplizierter wird das ganze natürlich.
Gruß
Steffen
PowerShell -Command ^"^& {exit (Start-Process -FilePath 'PowerShell.exe' -Wait -PassThru -Verb RunAs -ArgumentList @('-ExecutionPolicy', 'Bypass', '-File', '\"%PSPath%\"', '\"%Arg1%\"', '\"%Arg2%\"')).ExitCode}^"
Gruß
Steffen