2016-03-23 32 views
3

我想创建一个文件观察器与Powershell。只要文件发生变化,就需要运行我的PHP脚本。我的第一个想法是,一切都完美,但似乎只是触发一次。与Powershell文件观察器不触发总是

只要我改变给定文件夹中的* .js文件,PHP脚本就会触发。但它只触发一次。几分钟后我再次更改文件,但php脚本不再执行(即使Write-Host没有任何内容)。

这里是我的PowerShell的脚本:

#By BigTeddy 05 September 2011 

#This script uses the .NET FileSystemWatcher class to monitor file events in folder(s). 
#The advantage of this method over using WMI eventing is that this can monitor sub-folders. 
#The -Action parameter can contain any valid Powershell commands. I have just included two for example. 
#The script can be set to a wildcard filter, and IncludeSubdirectories can be changed to $true. 
#You need not subscribe to all three types of event. All three are shown for example. 
# Version 1.1 

$global:folder = 'C:\Users\Dario\Desktop\scripts' # Enter the root path you want to monitor. 
$filter = '*.js' # You can enter a wildcard filter here. 

# In the following line, you can change 'IncludeSubdirectories to $true if required.       
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'} 

# Here, all three events are registerd. You need only subscribe to events that you need: 

Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
$name = $Event.SourceEventArgs.Name 
$changeType = $Event.SourceEventArgs.ChangeType 
$timeStamp = $Event.TimeGenerated 
Write-Host "The file '$name' was $changeType at $timeStamp" -fore green 
} 

Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action { 
$name = $Event.SourceEventArgs.Name 
$changeType = $Event.SourceEventArgs.ChangeType 
$timeStamp = $Event.TimeGenerated 
$path = $global:folder + "\" + $name 

    Try { 
     Write-Host "The file '$name' was $changeType at $timeStamp" -fore white 
     cmd.exe /k ""C:\Users\Dario\Desktop\mep\script.bat" "$path"" 
    } Catch { 
     Write-Host "Problems" 
    } 
} 

# To stop the monitoring, run the following commands: 
# Unregister-Event FileDeleted 
# Unregister-Event FileCreated 
# Unregister-Event FileChanged 
+0

如何运行脚本以确保在PowerShell实例退出时事件不会被破坏? –

回答

0

有趣的问题!我开始谷歌搜索,发现这个它this现成的功能:

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' 

似乎做的正是你想要的...

0

我不想无礼,但我有另一种解决方案。我正在开发IntelliJ。 IntelliJ拥有自己的File Watcher,这就是为什么我会使用这个。