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:

  1. Eine Batch-Datei ausführen können
  2. Die Batch-Datei sollte Parameter
  3. 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!

Author: The Quantum Physicist, 2016-07-31

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!!
    

    geben Sie hier die Bildbeschreibung ein


Weitere Ressourcen

 3
Author: Drink Some Pimp Juice IT,
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

 2
Author: Drink Some Pimp Juice IT,
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 . . .
 0
Author: root,
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]
  1. Argumente für den Stapel in der Umgebungsvariablen _args_ speichern
  2. Lesen Sie die Batch-Datei in eine Zeichenfolge: ${%~f0} | out-string
  3. Erstellen Sie ein ScriptBlock aus der Zeichenfolge
  4. Argumente entpacken: @(iex('&{$args} ' + $env:_args_))
  5. 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)

 0
Author: snipsnipsnip,
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