37

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

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

这听起来准确吗?可能是什么问题,或者我该如何解决?

4

6 回答 6

66

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

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

为什么?

-NoProfile

这可确保您不依赖用户的 PowerShell 配置文件中的任何内容,并避免执行该附加代码的开销。

-NoLogo

这大多无关紧要。如果您正在捕获脚本的输出,也许它会这样做。主要是它让我感觉更好。

-非交互式

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

-ExecutionPolicy 绕过

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

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

因为我不希望任务依赖于您将来可能有其他原因更改的全局非默认设置。如果其他一些进程依赖于不同的执行策略,那么它不会与您的任务相冲突。

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

奖金

0x1有关导致计划任务的其他一些原因,请参阅 JohnLBevan 的答案

于 2014-08-07T00:04:58.650 回答
7

任务计划程序调用 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可能需要这些权限)。如果您不确定,请尝试勾选该选项以查看它是否解决了您的问题;如果它似乎没有任何区别,请不要选中它。

于 2017-03-14T00:31:54.400 回答
3

我以前做过这个并且有类似的问题。它几乎总是 PowerShell 安全设置。最明显的是,我会仔细检查您的执行策略(假设您已设置它)。

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

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

第一次运行后,您不必再担心这一点,它应该可以从任务调度程序运行。

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

于 2012-10-22T16:23:10.143 回答
2

前面的答案很有价值。我在“添加参数”字段中添加了以下值。

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

确保添加 & 符号并将路径括在花括号中。不要忘记在&符号之前和大括号后加上双引号。

于 2017-10-20T05:14:03.937 回答
0

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

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

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

如果是我的一个脚本,它是:

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

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

Add-Type -AssemblyName "System.ServiceProcess"

以及下一个错误:

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

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

于 2018-09-07T10:07:41.520 回答
0

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

-ExecutionPolicy它与, -Noninteractive,或任何其他系统权限-NoLogo-NoProfile运行脚本的用户帐户等无关。

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

于 2020-12-08T19:15:56.743 回答