【问题标题】:Powershell FileSystemWatcher action not workingPowershell FileSystemWatcher 操作不起作用
【发布时间】:2016-05-14 20:45:51
【问题描述】:

在下面的代码中,action.bat - 调用一个 java 进程,将文件名作为参数传递,而 log.txt - 记录一行文件名是用时间戳创建的。

我正在通过删除 10 个完美运行的 txt 文件来测试这个脚本, 我重复了这个测试几次,log.txt 得到更新,并且 action.bat 也被正确调用。

但是,当我让这个 filewatcher 运行 4 小时并删除 10 个新的文本文件时,只有 log.txt 得到了更新,但 action.bat 文件没有被调用。

当我再次杀死 powershell 并重新启动脚本并使用 10 个新文件再次测试时,它工作正常。

为什么等了 4 小时后 Start-process 没有被调用?但是日志语句会在操作中更新

我的代码类似于net event filewatch.ps1

 $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "D:\code\Apps\input"
    $watcher.Filter = "*.txt"
    $watcher.IncludeSubdirectories = $false
    $watcher.EnableRaisingEvents = $true 
### DEFINE ACTIONS AFTER A EVENT IS DETECTED
    $action = {
    $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "D:\code\Apps\log.txt" -value $logline   
                Start-process -Filepath D:\code\Apps\action.bat $path -Wait -passthru; 
                }    

### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY  
    $created = Register-ObjectEvent $watcher "Created" -Action $action
    while ($true) {sleep 10}

【问题讨论】:

    标签: powershell batch-file start-process


    【解决方案1】:

    您似乎缺少Register-ObjectEvent CmdLet、-SourceIdentifier 'FileCreated' 上的参数。

    更正的代码

     $watcher = New-Object System.IO.FileSystemWatcher
        $watcher.Path = "D:\code\Apps\input"
        $watcher.Filter = "*.txt"
        $watcher.IncludeSubdirectories = $false
        $watcher.EnableRaisingEvents = $true 
    ### DEFINE ACTIONS AFTER A EVENT IS DETECTED
        $action = {
        $path = $Event.SourceEventArgs.FullPath
                    $changeType = $Event.SourceEventArgs.ChangeType
                    $logline = "$(Get-Date), $changeType, $path"
                    Add-content "D:\code\Apps\log.txt" -value $logline   
                    Start-process -Filepath D:\code\Apps\action.bat $path -Wait -passthru; 
                    }    
    
    ### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY  
        $created = Register-ObjectEvent $watcher 'Created' -SourceIdentifier 'FileCreated' -Action $action
        #while ($true) {Start-Sleep 10}
    

    【讨论】:

    • 感谢您的回复 Travis,正如我提到的,我之前发布的代码工作正常,除了 Start-process 没有被调用。当我用这个更正的代码替换时,我无法运行脚本。但是,当我取消注释 #while ($true) {Start-Sleep 10} 似乎没问题时,为什么 'while' 会导致我出现问题?
    • 我在交互式会话中运行了代码。交互式会话中不需要 while,while 循环可能使处理事件的线程保持忙碌。我在action.bat 中将一些代码放入启动记事本中,记事本就启动了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多