Ich versuche, dieses Skript in PowerShell auszuführen. Ich habe das untenstehende Skript als ps.ps1
auf meinem Desktop gespeichert.
$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:\Program Files\abc.exe"}
Ich habe ein Batch-Skript erstellt, um dieses PowerShell-Skript auszuführen
@echo off
Powershell.exe set-executionpolicy remotesigned -File C:\Users\SE\Desktop\ps.ps1
pause
Aber ich bekomme diesen Fehler:
Sie benötigen den Parameter -ExecutionPolicy
:
Powershell.exe -executionpolicy remotesigned -File C:\Users\SE\Desktop\ps.ps1
Andernfalls betrachtet PowerShell die Argumente als auszuführende Zeile, und während Set-ExecutionPolicy
ist ein Cmdlet, hat es keinen -File
-Parameter.
Ich erkläre sowohl, warum Sie ein PowerShell-Skript aus einer Batchdatei aufrufen möchten, als auch in meinem Blogpost hier .
Grundsätzlich suchen Sie:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"
Wenn Sie Ihr PowerShell-Skript als Administrator ausführen müssen, verwenden Sie Folgendes:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Users\SE\Desktop\ps.ps1""' -Verb RunAs}"
Anstatt jedoch den gesamten Pfad zum PowerShell-Skript fest zu codieren, empfehle ich, die Batchdatei und die PowerShell-Skriptdatei in demselben Verzeichnis abzulegen, wie mein Blogbeitrag beschreibt.
Wenn Sie eine Batchdatei ausführen, die PowerShell als Administrator aufruft, führen Sie sie besser so aus und sparen Sie sich alle Mühe:
powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"
Es ist besser, Bypass
... zu verwenden.
Wenn Sie das aktuelle Verzeichnis ohne vollständig qualifizierten Pfad ausführen möchten, können Sie Folgendes verwenden:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"
Wenn Sie einige Skripts ausführen möchten, können Sie Set-executionpolicy -ExecutionPolicy Unrestricted
verwenden und dann mit Set-executionpolicy -ExecutionPolicy Default
zurücksetzen.
Beachten Sie, dass die Ausführungsrichtlinie nur beim Start der Ausführung geprüft wird (oder so scheint es), und Sie können Jobs im Hintergrund ausführen und die Ausführungsrichtlinie sofort zurücksetzen.
# Check current setting
Get-ExecutionPolicy
# Disable policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
# Choose [Y]es
Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 example.com | tee ping__example.com.txt }
Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 google.com | tee ping__google.com.txt }
# Can be run immediately
Set-ExecutionPolicy -ExecutionPolicy Default
# [Y]es
Wenn Ihr PowerShell-Anmeldeskript nach 5 Minuten (wie bei mir zuvor) auf einem 2012-Server ausgeführt wird, gibt es auf einem Server die Einstellung GPO - "Anmeldeskriptverzögerung konfigurieren" 5 Minuten Verzögerung, bevor das Anmeldeskript ausgeführt wird.
Ein weiteres einfaches Verfahren, um ein ps-Skript aus dem Stapel auszuführen, besteht darin, es einfach zwischen die ECHO- und die Umleitungszeichen (> und >>).. Einzufügen. Beispiel:
@echo off
set WD=%~dp0
ECHO New-Item -Path . -Name "Test.txt" -ItemType "file" -Value "This is a text string." -Force > "%WD%PSHELLFILE.ps1"
ECHO add-content -path "./Test.txt" -value "`r`nThe End" >> "%WD%PSHELLFILE.ps1"
powershell.exe -ExecutionPolicy Bypass -File "%WD%PSHELLFILE.ps1"
del "%WD%PSHELLFILE.ps1"
Letzte Zeile löscht die erstellte temporäre Datei.
Kleine Probe test.cmd
<# :
@echo off
powershell /nologo /noprofile /command ^
"&{[ScriptBlock]::Create((cat """%~f0""") -join [Char[]]10).Invoke(@(&{$args}%*))}"
exit /b
#>
Write-Host Hello, $args[0] -fo Green
#You programm...