当由Task Scheduler触发时,Powershell脚本将无法工作

时间:2019-11-18 22:37:23

标签: powershell task

我有一个可以在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任务识别为会话。...?

停滞继续。 :-/

0 个答案:

没有答案