Verständnis der Ausführung von Powershell im Batch mit Parametern
Ich habe eine Weile damit gegraben, aber ich konnte nicht verstehen, wie das funktioniert. Was ich brauche, ist:
- Eine Batch-Datei ausführen können
- Die Batch-Datei sollte Parameter
- Die Parameter sollten von der Batch-Datei an das PowerShell-Skript übergeben werden, das sich in derselben Datei befindet
Warum brauche ich das? Weil ich eine einfache Batch-Datei ausführen muss, um einige Dinge zu tun, aber ich brauche erweiterte Funktionen, die nur von PowerShell aus funktionieren. Insbesondere: Ich brauche ein SaveFileDialog
für eine Anwendung.
Folgendes habe ich gerade, wo ich die komplizierten Teile von SaveFileDialog
entfernt und einen einfachen Batch + Powershell-Teil hinterlassen habe:
<# :
@echo off
setlocal
powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF
#>
Write-Host "Hello, I'm PowerShell!"
Wenn ich das alles in eine Batchdatei lege, sagen wir myfile.bat
. Es läuft und ruft PowerShell auf und schreibt diese Nachricht.
Meine Frage / Anfrage: Wie kann ich myfile.bat param1 param2 param3
ausführen und diese Argumente/Parameter an mein PowerShell-Skript übergeben? Ich würde wirklich ein minimales Beispiel schätzen, das nur druckt die Parameter über Powershells write-host
.
Bitte fragen Sie nach weiteren Details. Danke!
4 answers
Wie kann ich myfile.bat param1 param2 param3, und lassen Sie diese Argumente / Parameter an mein PowerShell-Skript übergeben?
Erstellen Sie ein Batch-Skript, um Argumente zu akzeptieren
Sie müssten natürlich die Stapelargumente mit nachfolgenden SET arg#=%~#
Ich habe das Beispiel-Batch-Skript dazu gebracht, Argumente anzuzeigen, die Variablen oben einrichten, und diese an ein PS-Skript übergeben, das später mit einem Endergebnis verknüpft wird, um zu helfen klären Sie am Ende dieser Antwort hoffentlich mehr.
Beispiel Batch-Skript
@ECHO ON
SET arg1=%~1
SET arg2=%~2
SET arg3=%~3
SET arg4=%~4
SET PSScript=C:\Users\User\Desktop\Test.ps1
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%' '%arg1%' '%arg2%' '%arg3%' '%arg4%'"
EXIT /B
Erstellen Sie ein PowerShell-Skript, um Argumente zu akzeptieren
Sie müssten natürlich die PowerShell-Argumente mit nachfolgenden skalieren $arg#=$args[#]
Beispiel PowerShell Script
$arg1=$args[0]
$arg2=$args[1]
$arg3=$args[2]
$arg4=$args[3]
Write-Host "$arg1 is a beauty!!"
Write-Host "$arg2 is cool!!"
Write-Host "$arg3 has body odor!!"
Write-Host "$arg4 is a beast!!"
Zusammenbinden
-
Übergeben Sie Argumente an das Batch-Skript:
c:\users\user\desktop\test.cmd "Selena" "Justin" "Donald" "Bernie"
Übergeben Sie Argumente an das PowerShell-Skript:
Powershell -ExecutionPolicy Bypass -Command "& 'C:\Users\User\Desktop\Test.ps1' 'Selena' 'Justin' 'Donald' 'Bernie'
Vollständige Ergebnisse echo auf:
-
c:\users\user\desktop\test.cmd "Selena" "Justin" "Donald" "Bernie" SET arg1=Selena SET arg2=Justin SET arg3=Donald SET arg4=Bernie SET PSScript=C:\Users\User\Desktop\Test.ps1 SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0 CD /D "C:\Windows\System32\WindowsPowerShell\v1.0" Powershell -ExecutionPolicy Bypass -Command "& 'C:\Users\User\Desktop\Test.ps1' 'Selena' 'Justin' 'Donald' 'Bernie'" Selena is a beauty!! Justin is cool!! Donald has body odor!! Bernie is a beast!!
Weitere Ressourcen
-
Befehlszeilenargumente (Parameter)
%* in einer Batchdatei bezieht sich auf alle Argumente (z.B. %1 %2 %3 %4 %5 ...%255) nur Argumente %1 bis %9 können sein referenziert nach Nummer.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-05-25 02:49:21
Übergeben mehrerer Argumente an ein PowerShell-Skript über Batch-Skript
Möglicherweise können Sie so etwas wie die folgende Methode verwenden, da ich das Batch-Skript dazu bringen konnte, Argumente mit dieser Syntax an das PS-Skript zu übergeben.
Es muss ein dynamisches PS-Skript oben erstellen (die Routine :DynamicPSScriptBuild
) und es wird gelöscht, wenn es bereits vorhanden ist, und es wird es auch löschen, sobald alle Ausführungen verarbeitet sind.
Ich musste die PS -file
anstelle der -iex
(die grund Die PS1-Datei muss vorhanden sein und der dynamische Build davon), aber es funktioniert wie erwartet, wenn ich getestet habe, dass die anwendbaren Argumente einzeln an das Skript übergeben wurden, wobei jedes Argument eine PS-Skriptausführungsiteration ist.
Ich war mir nicht sicher, ob Sie alle Argumente benötigen, die an das PS-Skript übergeben werden einer nach dem anderen oder alle auf einmal bestanden oder wie Sie sagen, Skriptlogik würde mehrere Argumente behandeln, die während derselben Ausführung an sie übergeben werden aber vielleicht gibt Ihnen dies genug Details, um sich entsprechend anzupassen.
Der Teil des folgenden Skripts mit FOR %%A IN ("Hello I'm PowerShell!", "Goodbye I'm Leaving", "Come with it and get some more"
ist der Teil, in den Sie jede Zeichenfolge einfügen, um sie als Argument zu verwenden, das nacheinander pro Ausführungsiteration an das PS-Skript übergeben wird, wobei jeder Zeichenfolgenwert in doppelten Anführungszeichen steht und durch Kommas getrennt ist.
Skriptbeispiel
(Vielleicht möchten Sie sich umdrehen @ECHO OFF
und nehmen Sie die pause
command since I used those to help show alles pro Iteration, um zu bestätigen, dass alles wie erwartet funktioniert hat)
<# :
@ECHO ON
SETLOCAL
:DynamicPSScriptBuild
SET PSScript=%~f0.ps1
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
ECHO param($a) >>"%PSScript%"
ECHO Write-Host "$a" >>"%PSScript%"
:SetPSScriptArguments
FOR %%A IN ( "Hello I'm PowerShell!",
"Goodbye I'm Leaving",
"Come with it and get some more"
) DO CALL :Powershell "%%~A"
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
GOTO :EOF
:PowerShell
PowerShell -NoProfile -ExecutionPolicy Bypass -file "%PSScript%" "%~1"
pause
GOTO :EOF
Weitere Ressourcen
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-07-31 19:19:00
Übergeben Sie die Batch-Variable direkt aus der Batch-Datei an Ihre Powershell-Zeile. Um dies zu testen, habe ich das Cmdlet Write-Host
als Argument übergeben.
foo.bat
:
@echo off
set arg1=%1
powershell.exe %1 "this is from powershell"
pause
Startet das .bat
mit einem Argument,
.\foo.bat Write-Host
Ausgabe:
this is from powershell
Press any key to continue . . .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-08-01 16:18:49
Dieser Ansatz scheint in der Lage zu sein, Argumente größtenteils unverändert zu übergeben.
<# :
@echo off
setlocal
set _args_=%*
powershell -noprofile "[ScriptBlock]::Create((${%~f0} | out-string)).Invoke(@(iex('&{$args} ' + $env:_args_)))"
goto :EOF
#>
Write-Host "Hello, I'm PowerShell!"
Write-Host "And these are arguments: "
Write-Host $args[0]
Write-Host $args[1]
Write-Host $args[2]
- Argumente für den Stapel in der Umgebungsvariablen
_args_
speichern - Lesen Sie die Batch-Datei in eine Zeichenfolge:
${%~f0} | out-string
- Erstellen Sie ein
ScriptBlock
aus der Zeichenfolge - Argumente entpacken:
@(iex('&{$args} ' + $env:_args_))
-
Invoke
der ScriptBlock mit den Argumenten Array
Schritt 1 und 4 sind entscheidend, wenn Sie Argumente mit Anführungszeichen übergeben möchten. (Ex. myfile.bat param1 "param2 with spaces" param3
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-05-25 00:50:16