it-swarm.com.de

So führen Sie ein PowerShell-Skript aus einer Batchdatei aus

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:

Enter image description here

143
Eka

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.

195
Joey

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.

89
deadlydog

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.

13
Root Loop

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'"
12
e.gad

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
2
Nux

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.

1
Neil 11111

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.

0
Dobbelina

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...
0
DimoN