【问题标题】:Testing to see if a scheduled task exist in powershell测试以查看 powershell 中是否存在计划任务
【发布时间】:2013-07-16 05:47:05
【问题描述】:

我不明白为什么下面的代码不起作用:

Function createFirefoxTask() {
   $schedule = new-object -com Schedule.Service 
   $schedule.connect() 
   $tasks = $schedule.getfolder("\").gettasks(0)

   foreach ($task in ($tasks | select Name)) {
      echo "TASK: $task.name"
      if($task.equals("FirefoxMaint")) {
         write-output "$task already exists"
         break
      }
   }
} 
createFirefoxTask

我得到的输出是这样的:

FirefoxMaint                                                                          

TASK: @{Name=FirefoxMaint}.name
TASK: @{Name=Task1}.name
TASK: @{Name=Task2}.name
TASK: @{Name=Task3}.name
TASK: @{Name=Task4}.name
TASK: @{Name=Task5}.name

如果我从 shell 回显 $task.name 而不通过脚本,它会正确显示名称。

【问题讨论】:

    标签: powershell foreach scheduled-tasks


    【解决方案1】:

    您可以使用以下代码来测试PowerShell中是否存在计划任务:

    if(Get-ScheduledTask FirefoxMaint -ErrorAction Ignore) { #found } else { #not found}
    

    【讨论】:

    • 您应该为答案提供更多上下文,而不是仅仅删除 OP 或未来读者可能不理解的代码块。
    • 它工作正常。您也可以使用变量来存储任务 - $task = Get-ScheduledTask -TaskName $taskName -ErrorAction Ignore。它适用于 Windows 10 的 PowerShell 版本 5。如果不使用 ErrorAction,它也可以工作,但会向控制台打印错误。
    【解决方案2】:

    试试这个:

    Get-ScheduledTask -TaskName "Task Name" -ErrorAction SilentlyContinue -OutVariable task
    
    if (!$task) {
        # task does not exist, otherwise $task contains the task object
    }
    

    【讨论】:

      【解决方案3】:

      为了防止在任务不存在时 Get-ScheduledTask 出错 - 您可能需要考虑这样做:

      $taskName = "FireFoxMaint"
      $taskExists = Get-ScheduledTask | Where-Object {$_.TaskName -like $taskName }
      
      if($taskExists) {
         # Do whatever 
      } else {
         # Do whatever
      }
      

      【讨论】:

        【解决方案4】:

        如果您使用的是 v3.0,则可以使用 Get-ScheduledTask 执行此操作。例如,

        $task = Get-ScheduledTask -TaskName "FirefoxMaint" -TaskPath \
        

        然后,只需要检查$task的值。

        【讨论】:

        • 但是如果我运行的是 v3.0,如果我要运行它的机器是 v1.0 对我没有任何好处?
        • 在 4.0 中,当任务不存在时,这似乎会导致错误。
        • @RickRainey 部分正确,ScheduledTask 模块使用仅在 Windows 8 / Windows Server 2012 中引入的 CIM 类stackoverflow.com/a/22644879/740575
        【解决方案5】:

        当在双引号字符串中使用时,变量评估将在标点符号处停止。您可以使用$() 来表示字符串中的子表达式,如下所示:

        "TASK: $($task.name)"
        

        PowerShell 将计算括号内的表达式并使用结果展开字符串

        【讨论】:

        • 谢谢!这解决了我遇到的一个问题。为什么我的测试失败了?那份工作确实存在
        • @实际上测试没有失败..输出很丑
        • 我开始喜欢使用 -f 运算符来处理字符串,你可以这样做:('TASK: {0}' -f $task.name)
        • @Jakob -f 确实是一个不错的选择。发布答案;-)
        猜你喜欢
        • 2015-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多