PowerShell脚本不会作为Windows计划任务执行

时间:2012-10-22 16:01:52

标签: powershell scheduled-tasks

我有一个PowerShell脚本(可行)。在Windows任务计划程序中,我创建了一个新任务来执行"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",将参数作为我的PS1脚本传递。当任务运行时,我得到0x1的上次运行结果。

我更新了脚本,在脚本打开时写入日志文件,但没有发生。这几乎就像任务甚至无法打开Powershell.exe。

这听起来准确吗?问题是什么或我如何解决它?

6 个答案:

答案 0 :(得分:53)

如果您遇到的问题是执行策略,那么您还可以设置特定PowerShell调用的执行策略。这是我通过计划任务执行PowerShell时通常所做的事情:

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

为什么?

-NoProfile

这可以确保您don't rely on anything in the user's PowerShell profile,并避免执行其他代码的开销。

-nologo

这无关紧要;如果您正在捕获脚本的输出,也许会这样。大多数情况下,这让我感觉更好。

-nonInteractive

如果脚本中的某些内容意外地提示用户,请确保您的任务不会无限期地等待。使用此开关,脚本将退出;至少你会有一个错误代码而不是一个挂起的脚本。

-ExecutionPolicy Bypass

您可以在此处使用Unrestricted或您喜欢的执行政策。 这可能是您最需要的

为什么我更喜欢以这种方式设置执行策略:

因为我不希望任务依赖于全局非默认设置,您可能还有其他原因需要在将来进行更改。如果某个其他流程依赖于不同的执行策略,那么它就不会以这种方式与您的任务发生冲突。

另外,不必更改默认设置总是很好。少记住/记录/测试。

加成

See JohnLBevan's answer for some additional causes of 0x1 result in a scheduled task

答案 1 :(得分:5)

任务计划程序调用的PowerShell脚本有几种可能的原因导致代码0x1完成:

  • 执行策略不允许脚本运行。有关详细信息,请参阅Briantist's excellent answer
  • 该任务未启用Run with highest privileges标记(任务'常规标签上的复选框)。*
  • 参数被错误地传递给脚本。如果使用-File ".\MyScript.ps1" -Parameter1 'Demo'等方法,请尝试:-Command "& .\MyScript.ps1 -Parameter1 'Demo'"

*正如Ben在评论中指出的那样,Run with highest privileges不必启用/它取决于脚本是否需要管理员权限(例如,如果某些命令如Set-ExecutionPolicy或{{1可能需要这些)。如果您不确定,请尝试勾选该选项,看看它是否解决了您的问题;如果它似乎没有任何作用,请不加控制。

答案 2 :(得分:2)

我以前做过这个并遇到过类似的问题。它几乎总是PowerShell安全设置。最明显的是,我会仔细检查你的执行政策(假设你已经设定了它)。

该任务运行的用户是哪个?该用户之前是否运行过PowerShell脚本?如果我没记错的话,在第一次运行脚本时(不管执行策略如何),每个用户都会被提示“允许”PowerShell脚本运行(Y / N)。那之前我一直在咬我。尝试:

  • 以该用户身份登录
  • 检查执行政策
  • 从PowerShell提示符启动脚本
  • 回复随后的任何提示。

第一次运行后,您不必再担心,它应该从任务调度程序运行得很好。

根据您的域安全性,您可能还必须设置组执行策略。这篇文章详细介绍了如何执行此操作,以及其他一些要检查的内容: PowerShell Security

答案 3 :(得分:1)

之前的答案非常有价值。我在 Add Arguments 字段中添加了以下值。

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

确保添加&符号并将路径括在花括号中。别忘了在&符之前和关闭花括号之后有双引号。

答案 4 :(得分:0)

如果您没有任何错误消息并且不知道问题出在哪里-为什么PowerShell脚本不想从计划任务开始,请执行以下步骤来获取答案:

  1. 以已为“计划任务”设置为执行PowerShell脚本的用户身份运行CMD
  2. 浏览到PowerShell脚本所在的文件夹
  3. 执行PowerShell脚本(删除脚本中是否存在任何阻止错误通知的语句,例如$ ErrorActionPreference ='silentlycontinue')

您应该能够看到所有错误通知。

如果我的脚本之一是:

  

找不到类型[System.ServiceProcess.ServiceController]。确保包含此类型的程序集已加载。

在这种情况下,我必须在 脚本的开头以加载缺少的程序集:

Add-Type -AssemblyName "System.ServiceProcess"

接下来的错误:

  

使用“ 1”参数调用“ GetServices”的异常:“无法在计算机上打开服务控制管理器。此操作可能需要其他特权。”

     

select:无法处理该属性,因为属性“数据库名称”已经存在

答案 5 :(得分:0)

我使用@briantist的上述答案解决了这个问题,但我想确切地找出哪个开关在解决问题。

void main() { String abc = "123456.1234"; print(abc.substring(0,abc.indexOf(".")+3)); } -ExecutionPolicy-Noninteractive-NoLogo或任何其他系统特权,运行脚本的用户帐户等无关。

只需在-NoProfile字段中的脚本路径前面添加-File。没有此开关,PowerShell将启动,任务历史记录将显示Task Scheduler > Actions > Arguments,但脚本未执行。