我有一个可以在Powershell中正常运行的脚本,但是当从Task Scheduler或Powershell Scheduled Job触发时,它将无法正常工作。
以下是脚本(这是here找到的脚本的简化版本):
$folder = 'D:\<folder_to_monitor>'
$filter = '*.*'
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Swithmail /s /x "c:\swithmail\msg_send.xml"}
我可以在Powershell中运行此脚本,然后执行Get-EventSubscriber命令,然后将看到结果:
SubscriptionId : 2
SourceObject : System.IO.FileSystemWatcher
EventName : Created
SourceIdentifier : FileCreated
Action : System.Management.Automation.PSEventJob
HandlerDelegate :
SupportEvent : False
ForwardEvent : False
然后我可以将新文件放到要监视的文件夹中,并且会收到一封按照设计的电子邮件。精彩!就像冠军一样。
现在,我想在启动时运行此脚本,这样就不必记住每次重新引导服务器时都运行该脚本。我按照these的说明在Task Scheduler中设置了任务。然后,我手动启动任务(不想在生产期间重新引导服务器),但是这样做之后,当我运行Get-EventSubscriber命令时,什么也没得到。将文件放入受监控的文件夹不会发送电子邮件。
我还尝试通过遵循these的指示来设置计划的作业(我将作业设置为在设置的时间触发以进行测试,而不是使用-AtStartup变量),但是事件似乎没有发生像我直接运行脚本时一样进行注册。
编辑1: 根据来自@BiNZGi和@Nick的建议,我检查了事件查看器,并且没有与此任务计划程序任务或脚本相关的条目。因此,同样如建议的那样,我在脚本中添加了行以启动和停止PS转录功能:
$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
Start-Transcript -path C:\batch\scriptlog.txt -append
$folder = 'D:\<folder_to_monitor>'
$filter = '*.*'
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Swithmail /s /x "c:\swithmail\msg_send.xml"}
Stop-Transcript
结果:正在创建scriptlog.txt文件,并且似乎正在注册“ FileCreated”事件:
**********************
Windows PowerShell transcript start
Start time: 20191119112406
Username: <mydomain>\administrator
RunAs User: <mydomain>\administrator
Machine: <myserver> (Microsoft Windows NT 6.3.9600.0)
Host Application: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File c:\batch\<myscript>.ps1
Process ID: 8984
**********************
Transcript started, output file is C:\batch\scriptlog.txt
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
1 FileCreated NotStarted False
**********************
Windows PowerShell transcript end
End time: 20191119112407
**********************
但是,在受监视的文件夹中创建新文件不会生成电子邮件,这使我认为注册的事件仍然无法正常工作。但是,当我从Powershell ISE中运行脚本时,它运行良好。在Powershell ISE中键入Get-EventSubscriber命令时,我得到的输出与在scriptlog.txt文件中看到的一样。
我想知道是否不希望从Task Scheduler任务中调用事件注册?根据我在Help页上看到的内容,它是基于会话的。也许Powershell无法将Task Scheduler任务识别为会话。...?
停滞继续。 :-/