Register-ScheduledJob"已完成"但不是"跑步"预期的脚本

时间:2016-08-15 16:35:06

标签: powershell

背景

我有一个powershell脚本,旨在使用Register-ObjectEvent查看新文件的文件夹。

我可以让它在ISE和PowerShell控制台中运行就好了。它完全按照预期工作。它会监视文件夹并完成其工作。

使用Register-ScheduledJob计划的脚本

如果有帮助的话,这里是完整的.ps1:

$HomeStatus = 'C:\status'
$mFilter = '*.*'

gci $HomeStatus -Recurse | sort LastWriteTime -desc | select -Skip 1 | Remove-Item -Force

$WatchProps = @{
    Path = $HomeStatus
    Filter = $mFilter
    NotifyFilter = [IO.NotifyFilters]"FileName"
    IncludeSubdirectories = $False   
}

$Watcher = New-Object System.IO.FileSystemWatcher -Property $WatchProps

$isCreated = Register-ObjectEvent $Watcher Created -SourceIdentifier HomeStatus -Action{
    $name = $Event.SourceEventArgs.Name
    $changeType = $Event.SourceEventArgs.ChangeType
    $timeStamp = $Event.TimeGenerated
    gci $HomeStatus -Recurse | sort LastWriteTime -desc | select -Skip 1 | Remove-Item -Force
}

创建Register-ScheduledJob

我继续使用Register-ScheduledJob使其在启动时运行:

$startTrigger = New-JobTrigger -AtStartup -RandomDelay 00:01:30 #create trigger for 90 seconds after startup

Register-ScheduledJob -Trigger $startTrigger -FilePath C:\Users\x\Powershell\HomeStatus.ps1 -Name CamHomeStatus

在任务调度程序中创建作业就好了。我继续修改了任务调度程序中的权限,因此它以具有最高权限的SYSTEM运行:

enter image description here

问题

问题是它似乎执行预定的工作就好了,但脚本不在后台运行/工作。

我测试了它 - 首先重启机器,然后按需运行任务。从任务计划程序的“历史记录”选项卡中,它似乎正在执行而没有问题:

enter image description here

Get-Job返回以下内容:

PS C:\WINDOWS\system32> Get-Job

    Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
    --     ----            -------------   -----         -----------     --------             -------                  
    1      CamHomeStatus   PSScheduledJob  Completed     True            localhost            $HomeStatus = 'C:\User...

但是,如果我只是从ISE或PS控制台运行.ps1,那就不是我所看到的。当我从这些选项中的任何一个手动执行脚本时,我看到以下内容:

PS C:\WINDOWS\system32> Get-Job

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
5      HomeStatus                      Running       True                                 ...                 

所以对我来说,看起来任务调度程序运行预定作业就好了,但是一旦预定作业运行,它就不允许来自.ps1的Register-ObjectEvent作业开始/继续运行。 / p>

我在注册作业时是否错误地调用了脚本,还是我错过了一些允许脚本在预定作业初始化后运行的参数?

1 个答案:

答案 0 :(得分:1)

此问题完全是一个任务计划程序问题,与PowerShell脚本无关。

  1. Register-ObjectEvent需要保持打开任务。这是通过在任务
  2. 的操作中添加-NoExit标志来实现的
  3. 我需要修改操作,不仅要有-NoExit,还需要-NoProfile和-ExecutionPolicy Bypass。在本文后面发现:http://ramblingcookiemonster.github.io/Task-Scheduler/
  4. 我也从Register-ScheduledJob使用的默认-Command标志切换到-File标志。

    所以...在一天结束时,这就是我的预定任务操作选项卡的样子:

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoExit -NoProfile -ExecutionPolicy Bypass -File C:\Users\x\Powershell\HomeStatus.ps1