在Windows Server 2008 R2中,Get-ScheduledTask命令无法运行。

5

我正在尝试查找名称中包含特定模式的计划任务,对于我的情况,计划任务的名称应该包含 "ServiceNow" 这个模式。为此,我使用了 Get-ScheduledTask 命令,但是这个命令在 Windows Server 2008 R2 上失败了。

$taskPattern = "ServiceNow"
$taskDetails = Get-ScheduledTask | Where-Object {$_.TaskName -match $taskPattern  }
$taskName = $taskDetails.TaskName

这个脚本执行失败并显示错误信息:

"Get-ScheduledTask : 未识别 'Get-ScheduledTask' 为cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请验证路径是否正确,然后重试。"

之后,我尝试了另一种方法,它给出了"(taskname Date&Time State)",但我不知道如何仅从输出中提取出任务名。

$taskPattern = "ServiceNow" 
$taskExists = schtasks /query | select-string -patt $taskPattern 
$taskExists

请问有人能告诉我如何在Windows Server 2008 R2上仅提取实际任务名称使其正常工作吗? 谢谢您的帮助。


Windows Server 2008 R2 支持 PS 版本 5。请尝试升级 PowerShell,也许这样可以运行 Get-ScheduledTask。您可以使用 $PSVersionTable 命令检查当前已安装的版本。 - Paxz
我不想升级Powershell版本。有没有一种方法只过滤任务名称? - beginner
2个回答

16
在Windows Server 2008R2上无法获取Get-ScheduledTask,因为它是在Windows Server 2012中引入的,并且没有被移植回来。有关详细信息,请参见Github链接
最能描述这种情况的评论是:
“嗨@dronkoff-此模块支持PS 4.0。但问题不在于PowerShell的版本。问题在于此资源依赖的ScheduledTasks模块未内置于Windows Server 2008R2中,而是首次包含在Windows Server 2012中。
许多PowerShell模块都是如此:它们在较旧版本的Windows中缺失(例如Networking)。在偶尔出现的情况下,还有一种简单的解决方法。但在这种情况下,如果要将资源转换为使用schtasks.exe,则不可能进行完全重写,并且可能会导致某些非常不稳定和错误的情况(更不用说会出现不同本地化版本的schtasks的问题了)。恐怕我真的看不到这种情况发生(除非社区中的其他人对如何实现此目标有一些想法)。
但是您是正确的,应该提到目前不支持Windows Server 2008R2。”
解决方法是使用具有正确开关的schtasks
如果您将其放在Microsoft文件夹中,就像我在示例中所示,您只需要运行:
schtasks /tn \Microsoft\ServiceNow /query /fo LIST

输出:

Folder: \Microsoft
HostName:      XXXXXACL06
TaskName:      \Microsoft\ServiceNow
Next Run Time: 7/4/2018 8:16:22 AM
Status:        Ready
Logon Mode:    Interactive only

如果你想获得更多细节,可以使用/v(详细)开关:

schtasks /tn \Microsoft\ServiceNow /query /v > service_now_details.txt

编辑 - 寻找一个模式

如果您只有一个要搜索的模式,则必须使用一些附加工具来搜索字符串。Windows原生支持findstr(或者在PowerShell中使用Select-String(简写为sls):

然后,要寻找任务名称,可以使用以下命令:

schtasks /query /fo LIST | findstr "ServiceNow"

甚至可以拥有狂野的特权

schtasks /query /fo LIST | findstr "ServiceNo*"

或者使用 powershell 的方式:

schtasks /query /fo LIST | sls 'ServiceNo*'

在所有情况下,输出结果都将类似于这样(因为我的任务正好被命名为ServiceNow):

TaskName: \Microsoft\ServiceNow

Edit2 大小写敏感性

如果您正在搜索不区分大小写的字符串,则对于 findstr 您必须添加 /I 以使其不区分大小写。 PowerShell 的 select-string(sls)本来就是不区分大小写的。


任务名称并不是“ServiceNow”。它的名称包含模式“ServiceNow”。我想找出这个任务的完整名称。 - beginner
1
@初学者 我明白了。我会编辑答案并添加这个选项。 - tukan
@初学者请不要忘记当答案回答了你的问题时接受它(点赞也很好:))- https://stackoverflow.com/help/someone-answers - tukan
如何使此查询不区分大小写?假设任务名称为“servicenow”而不是“ServiceNow”,那么我们如何检查任何不区分大小写的情况?由于大小写敏感性,它会出现错误。 - beginner
@beginner,powershell 版本是不区分大小写的(实际上你需要添加一个开关才能使其区分大小写)。至于 findstr,你需要添加 /I 才能使其不区分大小写(查看 findstr /? 获取所有开关信息)。 - tukan

2
在GitHub上有一个很棒的脚本,名为Get-ScheduledTasks(注意服务名称末尾的S)。该脚本适用于旧版本的Windows操作系统,包括Windows Server 2003 / Windows XP。
感谢了不起的Warren F(又名Rambling Cookie Monster)创建和分享此脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接