簡體   English   中英

PowerShell 腳本不會作為 Windows 計划任務執行

[英]PowerShell script won't execute as a Windows scheduled task

我有一個 PowerShell 腳本(有效)。 在 Windows 任務計划程序中,我創建了一個新任務來執行"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" ,將參數作為我的 PS1 腳本傳遞。 當任務運行時,我得到0x1的上次運行結果。

我更新了我的腳本以在腳本打開時寫入日志文件,但沒有發生這種情況。 這幾乎就像任務甚至無法打開Powershell.exe。

這聽起來准確嗎? 可能是什么問題或我如何解決它?

如果您遇到的問題與執行策略有關,那么您還可以設置 PowerShell 的特定調用的執行策略。 這是我在通過計划任務執行 PowerShell 時通常會做的事情:

powershell.exe -NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File \\path\to\script.ps1

為什么?

-NoProfile

這可確保您不依賴於用戶的 PowerShell 配置文件中的任何內容,並避免執行該附加代碼的開銷。

-NoLogo

這大多無關緊要; 如果您正在捕獲腳本的輸出,也許可以。 主要是它讓我感覺更好。

- 非交互式

如果腳本中的某些內容意外提示用戶,確保您的任務不會無限期地等待。 使用此開關,腳本將直接退出; 至少你會有一個錯誤代碼而不是一個掛起的腳本。

-ExecutionPolicy 繞過

您可以在此處使用Unrestricted或您喜歡的任何執行策略。 這可能是您最需要的

為什么我更喜歡以這種方式設置執行策略:

因為我不希望該任務依賴於一個全局非默認設置,您將來可能有其他原因要更改。 如果某個其他進程依賴於不同的執行策略,那么它不會以這種方式與您的任務發生沖突。

另外,不必更改默認值總是很好。 較少記住/記錄/測試。

獎金

有關0x1結果導致計划任務的一些其他原因,請參閱 JohnLBevan 的回答

由任務調度程序調用的 PowerShell 腳本以代碼0x1完成有多種可能的原因:

  • 執行策略不允許腳本運行。 有關詳細信息,請參閱Briantist 的出色回答
  • 該任務沒有啟用Run with highest privileges標志(任務的常規選項卡上的復選框)。*
  • 參數被錯誤地傳遞給腳本。 如果使用諸如-File ".\\MyScript.ps1" -Parameter1 'Demo' ,請嘗試: -Command "& .\\MyScript.ps1 -Parameter1 'Demo'"

*正如 Ben 在評論中指出的那樣,不必啟用Run with highest privileges /這取決於腳本是否需要管理員權限(例如,某些命令,如Set-ExecutionPolicyStop-Process可能需要這些)。 如果您不確定,請嘗試勾選該選項以查看它是否可以解決您的問題; 如果它似乎沒有什么不同,請不要選中它。

我以前做過這個,也遇到過類似的問題。 它幾乎總是 PowerShell 安全設置。 最明顯的是,我會仔細檢查你的執行策略(假設你已經設置了它)。

任務以哪個用戶身份運行? 該用戶之前是否運行過 PowerShell 腳本? 如果我沒記錯的話,在第一次運行腳本時(不管執行策略如何),系統會提示每個用戶“允許”PowerShell 腳本運行(是/否)。 那之前咬過我。 嘗試:

  • 以該用戶身份登錄
  • 檢查執行策略
  • 從 PowerShell 提示符啟動腳本
  • 回復隨后的任何提示。

第一次運行后,您不必再擔心,它應該可以從任務調度程序中正常運行。

根據您的域安全性,您可能還必須設置組執行策略。 這里有一篇文章詳細介紹了如何做到這一點,以及其他一些需要檢查的事項: PowerShell 安全性

以前的答案很有價值。 我在添加參數字段中添加了以下值。

-noninteractive -nologo -command "&{path\to\script.ps1}"

確保添加與號並將路徑括在花括號中。 不要忘記在&符號之前和關閉大括號之后使用雙引號。

如果您沒有任何錯誤消息並且不知道問題是什么 - 為什么 PowerShell 腳本不想從計划任務啟動,請執行以下步驟以獲得答案:

  1. 以已設置定時任務的用戶身份運行CMD執行PowerShell腳本
  2. 瀏覽到 PowerShell 腳本所在的文件夾
  3. 執行 PowerShell 腳本(如果腳本中存在任何阻止錯誤通知的語句,如 $ErrorActionPreference= 'silentlycontinue',則刪除所有語句)

您應該能夠看到所有錯誤通知。

如果我的腳本之一是:

無法找到類型 [System.ServiceProcess.ServiceController]。 確保加載了包含此類型的程序集。

在這種情況下,我必須在腳本的開頭添加一行以加載缺少的程序集:

Add-Type -AssemblyName "System.ServiceProcess"

接下來的錯誤:

使用“1”個參數調用“GetServices”時出現異常:“無法打開計算機“上的服務控制管理器”。此操作可能需要其他權限。

select : 無法處理該屬性,因為屬性“數據庫名稱”已存在

我使用@briantist 的上述答案解決了這個問題,但我想確切地隔離哪個開關正在解決問題。

它與-ExecutionPolicy-Noninteractive-NoLogo-NoProfile或任何其他系統權限、運行腳本的用戶帳戶等-NoProfile

只需要在Task Scheduler > Actions > Arguments字段中的腳本路徑前面添加 -File 即可。 沒有這個開關,PowerShell 正在啟動,任務歷史記錄顯示Action Completed ,但腳本沒有執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM