我有一个powershell脚本,旨在使用Register-ObjectEvent查看新文件的文件夹。
我可以让它在ISE和PowerShell控制台中运行就好了。它完全按照预期工作。它会监视文件夹并完成其工作。
如果有帮助的话,这里是完整的.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使其在启动时运行:
$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运行:
问题是它似乎执行预定的工作就好了,但脚本不在后台运行/工作。
我测试了它 - 首先重启机器,然后按需运行任务。从任务计划程序的“历史记录”选项卡中,它似乎正在执行而没有问题:
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>
我在注册作业时是否错误地调用了脚本,还是我错过了一些允许脚本在预定作业初始化后运行的参数?
答案 0 :(得分:1)
此问题完全是一个任务计划程序问题,与PowerShell脚本无关。
我也从Register-ScheduledJob使用的默认-Command标志切换到-File标志。
所以...在一天结束时,这就是我的预定任务操作选项卡的样子:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoExit -NoProfile -ExecutionPolicy Bypass -File C:\Users\x\Powershell\HomeStatus.ps1