Php Powershell不总是触发的文件监视程序
我正在尝试使用Powershell创建文件监视程序。需要它来运行我的PHP脚本,一旦文件被更改。我的第一个想法是,一切都很完美,但似乎只是触发一次 只要我更改给定文件夹中的*.js文件,PHP脚本就会触发。但它只触发一次。几分钟后,我再次更改了文件,但php脚本不再执行(即使是Php Powershell不总是触发的文件监视程序,php,powershell,events,filesystemwatcher,Php,Powershell,Events,Filesystemwatcher,我正在尝试使用Powershell创建文件监视程序。需要它来运行我的PHP脚本,一旦文件被更改。我的第一个想法是,一切都很完美,但似乎只是触发一次 只要我更改给定文件夹中的*.js文件,PHP脚本就会触发。但它只触发一次。几分钟后,我再次更改了文件,但php脚本不再执行(即使是写主机也没有执行任何操作) 以下是我的Powershell脚本: Bigtedy于2011年9月5日发布 #此脚本使用.NET FileSystemWatcher类监视文件夹中的文件事件。 #与使用WMI事件相比,此方法的
写主机也没有执行任何操作)
以下是我的Powershell脚本:
Bigtedy于2011年9月5日发布
#此脚本使用.NET FileSystemWatcher类监视文件夹中的文件事件。
#与使用WMI事件相比,此方法的优点是可以监视子文件夹。
#-Action参数可以包含任何有效的Powershell命令。例如,我刚刚包括了两个。
#可以将脚本设置为通配符筛选器,并将IncludeSubDirectory更改为$true。
#您不需要订阅所有三种类型的活动。举例来说,这三个都显示出来了。
#版本1.1
$global:folder='C:\Users\Dario\Desktop\scripts'#输入要监视的根路径。
$filter='*.js'#您可以在此处输入通配符筛选器。
#在下一行中,如果需要,可以将“IncludeSubdirectories”更改为$true。
$fsw=新对象IO.FileSystemWatcher$文件夹,$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
写入主机“文件“$name”是$timeStamp处的$changeType”-绿色
}
Register ObjectEvent$fsw已更改-SourceIdentifier文件已更改-操作{
$name=$Event.SourceEventArgs.name
$changeType=$Event.SourceEventArgs.changeType
$timeStamp=$Event.TimeGenerated
$path=$global:folder+“\”+$name
试一试{
写入主机“文件“$name”是$timeStamp处的$changeType”-白色
cmd.exe/k“C:\Users\Dario\Desktop\mep\script.bat”“$path”
}抓住{
写主机“问题”
}
}
#要停止监视,请运行以下命令:
#取消注册事件文件已删除
#取消注册已创建的事件文件
#取消注册事件文件已更改
有趣的问题!我开始在谷歌上搜索这个,并找到了它的现成功能:
Function Start-FileSystemWatcher {
[cmdletbinding()]
Param (
[string]$Path,
[parameter()]
[ValidateSet('Changed','Created','Deleted','Renamed')]
[string[]]$EventName,
[string]$Filter,
[parameter()]
[System.IO.NotifyFilters]$NotifyFilter,
[switch]$Recurse,
[scriptblock]$Action
)
$FileSystemWatcher = New-Object System.IO.FileSystemWatcher
If (-NOT $PSBoundParameters.ContainsKey('Path')){
$Path = $PWD
}
$FileSystemWatcher.Path = $Path
If ($PSBoundParameters.ContainsKey('Filter')) {
$FileSystemWatcher.Filter = $Filter
}
If ($PSBoundParameters.ContainsKey('NotifyFilter')) {
$FileSystemWatcher.NotifyFilter = $NotifyFilter
}
If ($PSBoundParameters.ContainsKey('Recurse')) {
$FileSystemWatcher.IncludeSubdirectories = $True
}
If (-NOT $PSBoundParameters.ContainsKey('EventName')){
$EventName = 'Changed','Created','Deleted','Renamed'
}
If (-NOT $PSBoundParameters.ContainsKey('Action')){
$Action = {
Switch ($Event.SourceEventArgs.ChangeType) {
'Renamed' {
$Object = "{0} was {1} to {2} at {3}" -f $Event.SourceArgs[-1].OldFullPath,
$Event.SourceEventArgs.ChangeType,
$Event.SourceArgs[-1].FullPath,
$Event.TimeGenerated
}
Default {
$Object = "{0} was {1} at {2}" -f $Event.SourceEventArgs.FullPath,
$Event.SourceEventArgs.ChangeType,
$Event.TimeGenerated
}
}
$WriteHostParams = @{
ForegroundColor = 'Green'
BackgroundColor = 'Black'
Object = $Object
}
Write-Host @WriteHostParams
}
}
$ObjectEventParams = @{
InputObject = $FileSystemWatcher
Action = $Action
}
ForEach ($Item in $EventName) {
$ObjectEventParams.EventName = $Item
$ObjectEventParams.SourceIdentifier = "File.$($Item)"
Write-Verbose "Starting watcher for Event: $($Item)"
$Null = Register-ObjectEvent @ObjectEventParams
}
}
Start-FileSystemWatcher -Path 'C:\Users\me\Downloads\Input_Test' -EventName Changed -Filter '*.js'
它似乎正是你想要的…我不想粗鲁,但我有另一个解决办法。我正在开发IntelliJ。IntelliJ有一个自己的文件监视程序
,这就是为什么我会使用它。如果您的PowerShell实例退出,您如何运行脚本以确保事件不会被破坏?