Mit der Eingabeaufforderung ein Powershellscript ausführen?
Hallo, ich mochte ein (simples) Powershell-Script mit der Eingabeaufforderung starten.
Das Batch-Script sieht bisher so aus:
@echo off
del %tmp%\drive.ps1
echo Set-ExecutionPolicy RemoteSigned >%tmp%\drive.ps1
echo New-PSDrive -Name S -PSProvider FileSystem -Root \\MYCLOUDEX2ULTRA\Public -Persist >>%tmp%\drive.ps1
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile & "%tmp%\drive.ps1"
Die Datei startet zwar die PowerShell aber nicht die Datei. (Und fragt danach wie ich sie öffnen möchte)
Wenn ich es allerdings do angehe:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile "%tmp%\drive.ps1"
bekomme ich diesen lustigen Fehler:
C:\Users\nikla\AppData\Local\Temp\drive.ps1 : Die Datei "C:\Users\nikla\AppData\Local\Temp\drive.ps1" kann nicht
geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informationen finden Sie
unter "about_Execution_Policies" (https:/go.microsoft.com/fwlink/?LinkID=135170).
In Zeile:1 Zeichen:1
+ C:\Users\nikla\AppData\Local\Temp\drive.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : Sicherheitsfehler: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
Und ohne -NoProfile kommt exakt der gleiche Fehler.
Soah, nun bin ich mit mein Latein am Ende. Könnt ihr mir da weiterhelfen?
2 Antworten
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
}
"
"
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.
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.
In dem Fall befolge das Dreipunktprotokoll:
- Was ist das erwartete Ergebnis?
- Was ist das erhaltene Ergebnis?
- Was genau besagt die Fehlermeldung?
Wenn man mal nachdenkt weiß man das auch :)