2013-10-12 41 views
104

Sto tentando di eseguire questo script in PowerShell. Ho salvato lo script seguente come ps.ps1 sul mio desktop.Come eseguire uno script PowerShell da un file batch

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

ho fatto 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

risposta

145

È 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 il parametro -File.

+1

@joey ha funzionato grazie..ma dopo aver eseguito il file bat ho ricevuto questo errore "Waring: column 'command' non si adatta allo schermo ed è stato rimosso" – Eka

+0

Questo è un avviso, non un errore. E più di un argomento per un'altra domanda. – Joey

+0

@joey è saggio scrivere un'altra domanda in stack.SE per questo avviso secondario? – Eka

69

Spiega entrambi i motivi per cui si desidera chiamare uno script PowerShell da un file batch e come farlo in my blog post here.

Questo è fondamentalmente quello che stai cercando:

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

E se è necessario eseguire lo script PowerShell come amministratore, utilizzare 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 l'intero Tuttavia, si consiglia di posizionare il file batch e il file di script di PowerShell nella stessa directory, come descritto nel post del blog.

+1

Yay admin in esecuzione! – PsychoData

+0

Invoke-WebRequest funziona correttamente quando si digita la riga di comando in una finestra di cmd, ma restituisce un 404 ogni volta che lo eseguo da un file batch. Sto cercando 'PowerShell -NoProfile -ExecutionPolicy Bypass -Command" e {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass Invoke-WebRequest https://www.example.com/example.ics -OutFile C: \ _ my \ script.ics '-Verb RunAs} ";' o 'powershell -Command" Invoke-WebRequest https://www.example.com/example.ics -OutFile c: \ _ my \ file.ics "', o usando il -File opzione per lo stesso in un file .ps1, o '(New-Object Net.WebClient) .DownloadFile'. Qualche idea? – Chris

+0

Prova a usare -ExecutionPolicy Senza restrizioni. Immagino che l'opzione Bypass non dia accesso alla rete PowerShell. – deadlydog

7

Se si esegue un file batch chiamando PowerShell come amministratore, è meglio correre in questo modo, risparmiando tutti i guai:

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

E 'meglio usare Bypass ...

0

Se si desidera eseguire alcuni script, è possibile utilizzare Set-executionpolicy -ExecutionPolicy Unrestricted e quindi ripristinare 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 il criterio 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 
7

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

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'" 
0

Se lo script di login PowerShell è in funzione dopo 5 minuti (come la mia) su un 2012 server, c'è un'impostazione GPO su un server - 'Configure Login script Delay' l'impostazione predefinita 'non configurata' questo lascerà un ritardo di 5 minuti prima di eseguire lo script di login.

Problemi correlati