PowerShell 脚本不会作为 Windows 计划任务执行
Posted
技术标签:
【中文标题】PowerShell 脚本不会作为 Windows 计划任务执行【英文标题】:PowerShell script won't execute as a Windows scheduled task 【发布时间】:2012-10-12 11:42:37 【问题描述】:我有一个 PowerShell 脚本(有效)。在 Windows 任务计划程序中,我创建了一个新任务来执行 "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
,将参数作为我的 PS1 脚本传递。当任务运行时,我会得到 0x1
的上次运行结果。
我更新了我的脚本以在脚本打开时写入日志文件,但这种情况没有发生。就好像任务连Powershell.exe都打不开一样。
这听起来准确吗?可能是什么问题或我该如何解决?
【问题讨论】:
【参考方案1】:我使用@briantist 的上述答案解决了这个问题,但我想准确地找出解决问题的开关。
它与-ExecutionPolicy
、-Noninteractive
、-NoLogo
、-NoProfile
或任何其他系统权限、运行脚本的用户帐户等无关。
只需在Task Scheduler > Actions > Arguments
字段的脚本路径前添加-File即可。如果没有此开关,PowerShell 将启动并且任务历史显示Action Completed
,但脚本未执行。
【讨论】:
【参考方案2】:任务计划程序调用的 PowerShell 脚本使用代码 0x1
完成的可能原因有多种:
Run with highest privileges
标志(任务“常规”选项卡上的复选框)。*
参数被错误地传递给脚本。如果使用-File ".\MyScript.ps1" -Parameter1 'Demo'
等方法,请尝试:-Command "& .\MyScript.ps1 -Parameter1 'Demo'"
*正如 Ben 在 cmets 中指出的那样,Run with highest privileges
不必启用/这取决于脚本是否需要管理员权限(例如,Set-ExecutionPolicy
或 Stop-Process
等某些命令可能需要这些权限)。如果您不确定,请尝试勾选该选项以查看它是否解决了您的问题;如果它似乎没有影响,请不要选中它。
【讨论】:
如前所述,Run with highest privileges
失败只是几个原因之一,人们应该了解它的作用,并在检查之前确认它确实是失败的原因。有关该复选框的确切作用的说明,请参阅social.technet.microsoft.com/Forums/windows/en-US/…。【参考方案3】:
如果您没有任何错误消息并且不知道问题所在 - 为什么 PowerShell 脚本不想从计划任务开始,请执行以下步骤以获得答案:
-
以已设置计划任务的用户身份运行 CMD 以执行 PowerShell 脚本
浏览到 PowerShell 脚本所在的文件夹
执行 PowerShell 脚本(删除所有阻止错误通知的语句(如果脚本中存在 $ErrorActionPreference= 'silentlycontinue'))
您应该能够看到所有错误通知。
如果我的脚本之一是:
找不到类型 [System.ServiceProcess.ServiceController]。确保已加载包含此类型的程序集。
在这种情况下,我必须在 加载缺失程序集的脚本开头:
Add-Type -AssemblyName "System.ServiceProcess"
以及接下来的错误:
使用“1”参数调用“GetServices”的异常:“无法在计算机''上打开服务控制管理器。此操作可能需要其他权限。”
select : 无法处理该属性,因为属性“数据库名称”已存在
【讨论】:
【参考方案4】:前面的答案很有价值。我在 Add Arguments 字段中添加了以下值。
-noninteractive -nologo -command "&path\to\script.ps1"
确保添加与号并将路径括在花括号中。不要忘记在&符号之前和大括号后加双引号。
【讨论】:
【参考方案5】:我以前做过这个并且遇到过类似的问题。它几乎总是 PowerShell 安全设置。最明显的是,我会仔细检查你的执行策略(假设你已经设置了它)。
任务以哪个用户身份运行?该用户之前是否运行过 PowerShell 脚本?如果我没记错的话,在第一次运行脚本时(无论执行策略如何),都会提示每个用户“允许”PowerShell 脚本运行(是/否)。那以前就咬过我。试试:
以该用户身份登录 检查执行策略 从 PowerShell 提示符启动脚本 回复随后的任何提示。第一次运行后,您不必再担心这个问题,它应该可以从任务调度程序运行。
根据您的域安全性,您可能还必须设置组执行策略。这里有一篇文章详细介绍了如何做到这一点,以及其他一些需要检查的事情:PowerShell Security。
【讨论】:
感谢@BryceAtNetwork23!那篇文章内容丰富,最终引导我找到解决方案..选中“以最高权限运行”复选框,哈哈。谢谢!【参考方案6】:如果您遇到的问题与执行策略有关,那么您还可以设置特定 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
这几乎无关紧要;如果您正在捕获脚本的输出,也许它会这样做。主要是它让我感觉更好。
-非交互
确保如果脚本中的某些内容意外提示用户,您的任务不会无限期等待。使用此开关,脚本将直接退出;至少你会有一个错误代码而不是一个挂起的脚本。
-ExecutionPolicy 绕过
您可以在此处使用Unrestricted
或您喜欢的任何执行策略。 这可能是您最需要的一个。
为什么我更喜欢这样设置执行策略:
因为我不希望任务依赖于您将来可能有其他原因更改的全局非默认设置。如果某个其他进程依赖于不同的执行策略,那么它不会与您的任务相冲突。
另外,不必更改默认值总是很好的。少记/记录/测试。
奖金
See JohnLBevan's answer for some additional causes of 0x1
result in a scheduled task.
【讨论】:
一个旧答案,但它仍在解决问题 - 谢谢!这解决了使用管理员帐户可以正常运行但使用服务帐户无法正常运行的计划任务的问题。检查了权限,一切看起来都很好,但仍然出现错误。按照上面列出的方式运行解决了问题。 还要检查运行任务的帐户是否对您在调度程序任务中指定的文件夹具有执行权限。 谢谢!我刚刚添加了-ExecutionPolicy Bypass
,我的 PowerShell 脚本在 Windows 中作为计划任务完美运行。我很感激你分享了这个!我花了几天时间寻找答案。再次感谢!
很高兴听到@bhall!以上是关于PowerShell 脚本不会作为 Windows 计划任务执行的主要内容,如果未能解决你的问题,请参考以下文章
如果 IP 地址已配置,如何使用 Powershell 脚本检查