Mit der Eingabeaufforderung ein Powershellscript ausführen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Aufruf eines .ps1-Scripts:

powershell.exe -NoProfile -ExecutionPolicy Bypass ".\demo.ps1"

oder verkürzt:

powershell.exe -ex Bypass ".\demo.ps1"

da Powershell jedoch auch Scripte (bis 8000 Zeichen Länge) direkt in der Kommandozeile ausführen kann, benötigst Du keine Scriptdatei:

powershell -c "Write-Host 'Hallo ich bin ein InlineScript.' -foreground magenta; Get-Date|Write-Host -foreground green;<#nächster Befehl ...; usw#>"

einfach das Ganze Script zwischen einem "Quotepaar" übergeben. Sollten "Quotes" innerhalb des Inliners nötig sein müssen diese verdreifacht werden:

Powershell -c "$MyVar="""ich bin ein normaler String""";[char[]]$MyVar|foreach{Write-Host """$_""" -fo blue}"

aber weshalb machst Du nicht alles in Powershell und benutzt einen Batchheader einfach zum starten eines Powershellscripts in der Batch?

HybridBatch.cmd

 <# : Batch Abschnitt ,Batch sieht in dieser Zeile die Eingabe aus der Datei # an ein SprungLabel, Powershell sieht den begin eines Kommentars. 
@echo off 

 rem alles von hier bis :run dient der Demo....
if "%~1" neq "" goto :run
echo das ist die Batch...
echo Hilfe: Ziehe Dateien auf die die Batch "%~nx0"...
echo ...oder auch nicht 
echo Die Dateinamen werden an das Powershellscript weitegeleitet.
timeout 2 >nul
color 1f
cls
:run
 rem Diese Zeile nicht veränden! startet Powershell ohne Rechtevergabe und übergibt Parameter über die Pipe
(for %%I in ("%~f0" %*) do @echo:%%~I)|powershell -noprofile "[Array]$argv = $input|?{$_}; iex (${%~f0} | out-string)"

echo Wieder zurueck in der Batch
 rem das folgende pause hält das Fenster offen....
pause
exit /b
: Ende Batch  
:: Ab der nächsten Zeile beginnt das eigentliche PowershellScript, da kannst Du Powershellcode einfügen wie es Dir beliebt... #>
#ab hier Dein Code...
"Jetzt bin ich in der Powershell"
$argv |%{ "`$argv[{0}]: $_" -f $i++};$i=$Null;
$ScriptName=$argv[0]
 #alle übergebenen Parameter außer $argv[0] der Variable Params zuweisen:
$Params=$argv|Select -Skip 1
""
"Name der Hybridbatch:"
$ScriptName
 #Params ist ein Array. Einzelne Elemente können über $Params[IndexNummer] aufgerufen werden.
if ($Params) {
  ""
  "an die Batch uebergebene Parameter:"
  $Params
}
"
"
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass "%tmp%\drive.ps1"

P.S.: Dass Variante (die mit dem &) nicht zum gewünschten Ergebnis führt ist eigentlich selbstverständlich.

Jklas2011 
Fragesteller
 03.04.2022, 08:11

Wenn man mal nachdenkt weiß man das auch :)

0
Jklas2011 
Fragesteller
 03.04.2022, 08:28
@Jklas2011

Tut mir leid, jetzt wird zwar das Script ausgeführt. Aber selbst mit Admin-Rechten tut das Script nicht das was es in der Powershell tut.

0
Zahhak  03.04.2022, 08:55
@Jklas2011

In dem Fall befolge das Dreipunktprotokoll:

  1. Was ist das erwartete Ergebnis?
  2. Was ist das erhaltene Ergebnis?
  3. Was genau besagt die Fehlermeldung?
0