FileSystemWatcher用于执行.NET函数

时间:2013-06-25 16:27:00

标签: .net powershell filesystemwatcher

我正在创建一个快速的临时修复程序,如果这很脏,请对不起,但是 -

目标

我想使用Powershells Register-Event cmd等待文件夹中丢弃的文件,然后调用解析文件并将其输出到excel的函数。我不需要编码方面的帮助,只需要概念。对于我来说,这个事件的运行位置以及它必须使用的资源仍然有点神秘。

我尝试过的事情

  1. 一个.ps1文件,底部注册了事件,调用顶部的函数,由批处理文件调用。
    行为:停在这一行:

    $sr = new-object System.IO.StreamReader($copyPath)
    

    这是我第一次调用.NET,所以这就是为什么我认为这是.NET的一个问题。

  2. 两个.ps1文件,FileWatcher和Parser,在单独运行时效果很好,由批处理文件调用。
    行为: FileWatcher输出“This Line”但未能在Parser中输出任何行,并且永远不会到达该行。

    Register-ObjectEvent $fsw Changed -SourceIdentifier FileChange -Action {
      Write-Host "This Line"
      .\src\Parser.ps1
      Write-host "That Line"
    }
    
  3. 我甚至非常绝望地去了两个ps1文件和两个批处理文件。让我们说它不起作用。

  4. 我正在使用的通用批处理文件命令:

    powershell.exe -noexit C:\scripts\src\FileWatcher.ps1
    

    问题

    为什么某些命令在从已注册的事件调用时运行正常,而其他命令如.NET不起作用?

    我想要实现的是什么?

    你有更好的方法来实现我的目标吗? (仅限脚本,请记住这是一个修补程序)。

1 个答案:

答案 0 :(得分:3)

以下对我有用(代码主要是从here复制的):

$folder = 'c:\Temp'
$filter = '*.*'

$monitor = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
  IncludeSubdirectories = $false;
  NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}

Register-ObjectEvent $monitor Created -SourceIdentifier FileCreated -Action {
  $name = $Event.SourceEventArgs.FullPath
  $sr = New-Object System.IO.StreamReader($name)
  Write-Host $sr.ReadToEnd()
  $sr.Close()
}