Php Powershell不总是触发的文件监视程序

Php Powershell不总是触发的文件监视程序,php,powershell,events,filesystemwatcher,Php,Powershell,Events,Filesystemwatcher,我正在尝试使用Powershell创建文件监视程序。需要它来运行我的PHP脚本,一旦文件被更改。我的第一个想法是,一切都很完美,但似乎只是触发一次 只要我更改给定文件夹中的*.js文件,PHP脚本就会触发。但它只触发一次。几分钟后,我再次更改了文件,但php脚本不再执行(即使是写主机也没有执行任何操作) 以下是我的Powershell脚本: Bigtedy于2011年9月5日发布 #此脚本使用.NET FileSystemWatcher类监视文件夹中的文件事件。 #与使用WMI事件相比,此方法的

我正在尝试使用Powershell创建文件监视程序。需要它来运行我的PHP脚本,一旦文件被更改。我的第一个想法是,一切都很完美,但似乎只是触发一次

只要我更改给定文件夹中的*.js文件,PHP脚本就会触发。但它只触发一次。几分钟后,我再次更改了文件,但php脚本不再执行(即使是
写主机
也没有执行任何操作)

以下是我的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实例退出,您如何运行脚本以确保事件不会被破坏?