2013-10-12 157 views
104

我試圖在PowerShell中運行此腳本。我在桌面上將以下腳本保存爲ps.ps1如何從批處理文件運行PowerShell腳本

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

我做了一個批處理腳本來運行這個PowerShell腳本

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

但我收到此錯誤:

Enter image description here

回答

145

您需要-ExecutionPolicy參數:

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

否則PowerShell的考慮參數的線來執行,雖然Set-ExecutionPolicy cmdlet的,它沒有-File參數。

+1

@joey它的工作thanks..but運行批處理文件我得到這個錯誤後,「華林:列‘命令’不適合顯示,除去」 – Eka

+0

這是一個警告,而不是錯誤。更多的是另一個問題的主題。 – Joey

+0

@joey在stack.SE中寫下另一個問題是否明智? – Eka

69

我解釋了爲什麼要從批處理文件中調用PowerShell腳本以及如何執行它in my blog post here

這基本上是你在找什麼:

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

如果你需要在你的PowerShell腳本作爲管理員,使用此:

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

而不是硬編碼整個儘管如此,我建議將批處理文件和PowerShell腳本文件放在同一個目錄中,正如我的博客文章所描述的。

+1

Yay管理員正在運行! – PsychoData

+0

當我在cmd窗口中鍵入命令行時,Invoke-WebRequest工作正常,但每當我從批處理文件中運行它時都會返回404。我正在嘗試'PowerShell -NoProfile -ExecutionPolicy Bypass -Command「&{啓動 - 進程PowerShell -ArgumentList' - 無配置文件 - 執行策略繞過調用 - WebRequest https://www.example.com/example.ics -OutFile C:\ _ my \ script.ics'-Verb RunAs}「;'或'powershell -Command」調用WebRequest https://www.example.com/example.ics -OutFile c:\ _ my \ file.ics「',或使用-File選項在.ps1文件中相同,或者(New-Object Net.WebClient).DownloadFile'。有任何想法嗎? – Chris

+0

嘗試使用-ExecutionPolicy不受限制。我在猜測Bypass選項不能給PowerShell網絡訪問權限。 – deadlydog

7

如果你運行一個批處理文件調用的PowerShell作爲管理員,你最好這樣運行了它,節省您的一切煩惱:

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

這是更好地使用Bypass ...

0

如果您想要運行幾個腳本,可以使用Set-executionpolicy -ExecutionPolicy Unrestricted,然後使用Set-executionpolicy -ExecutionPolicy Default進行重置。

注意,執行策略,才檢查,當你開始執行(或者看起來是這樣),所以你可以在後臺運行的作業,並立即重新執行策略。

# 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

如果你想從沒有一個完全合格的路徑在當前目錄下運行,你可以使用:

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

如果您PowerShell的登錄腳本5分鐘後運行(如我的是)上2012服務器,服務器上有一個GPO設置 - '配置登錄腳本延遲'默認設置'未配置',這將在運行登錄腳本之前留出5分鐘的延遲時間。

相關問題