it-swarm-eu.dev

Come eseguire uno script PowerShell da un file batch

Sto cercando di eseguire questo script in PowerShell. Ho salvato lo script seguente come ps.ps1 sul mio desktop.

$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:\Program Files\abc.exe"}

Ho creato uno script batch per eseguire questo script PowerShell

@echo off
Powershell.exe set-executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1
pause

Ma sto ottenendo questo errore:

Enter image description here

143
Eka

È necessario il parametro -ExecutionPolicy:

Powershell.exe -executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1

In caso contrario, PowerShell considera gli argomenti una riga da eseguire e mentre Set-ExecutionPolicy è un cmdlet, non ha alcun parametro -File.

195
Joey

Spiegherò entrambi i motivi per cui vorrai chiamare uno script PowerShell da un file batch e come farlo nel mio post del blog qui .

Questo è fondamentalmente quello che stai cercando:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"

E se hai bisogno di eseguire il tuo script PowerShell come amministratore, usa questo:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Users\SE\Desktop\ps.ps1""' -Verb RunAs}"

Invece di codificare completamente l'intero percorso dello script di PowerShell, ti consiglio di posizionare il file batch e il file di script di PowerShell nella stessa directory, come descritto nel post del blog.

89
deadlydog

Se si esegue un file batch che chiama PowerShell come amministratore, è meglio eseguirlo in questo modo, risparmiando tutti i problemi:

powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"

È meglio usare Bypass...

13
Root Loop

Se si desidera eseguire dalla directory corrente senza un percorso completo, è possibile utilizzare:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"
12
e.gad

Se si desidera eseguire alcuni script, è possibile utilizzare Set-executionpolicy -ExecutionPolicy Unrestricted e quindi reimpostare con Set-executionpolicy -ExecutionPolicy Default.

Si noti che il criterio di esecuzione viene controllato solo quando si avvia l'esecuzione (o così sembra) e quindi è possibile eseguire i lavori in background e ripristinare immediatamente la politica di esecuzione.

# 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

Se lo script di accesso di PowerShell è in esecuzione dopo 5 minuti (come il mio era) su un server 2012, c'è un'impostazione GPO su un server - "Configura script di accesso ritardato" l'impostazione predefinita "non configurata" lascerà un Ritardo di 5 minuti prima di eseguire lo script di accesso.

1
Neil 11111

Un altro modo semplice per eseguire uno script ps da batch è semplicemente incorporarlo tra i caratteri ECHO e Redirection, (> e >>), Esempio: 

@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"

L'ultima riga cancella il file temporaneo creato.

0
Dobbelina