【问题标题】:FileSystemWatcher to execute .NET functionsFileSystemWatcher 执行 .NET 函数
【发布时间】:2015-10-24 18:49:10
【问题描述】:

我正在创建一个快速的临时修复,如果这很脏,很抱歉,但是-

目标

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

我尝试过的事情

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

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

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

  2. 两个 .ps1 文件,FileWatcher 和 Parser,在单独运行时都能很好地工作,由批处理文件调用。
    行为: FileWatcher 输出“此行”,但无法输出任何行解析器,永远不会到达那一行。

    Register-ObjectEvent $fsw Changed -SourceIdentifier FileChange -Action {
      Write-Host "This Line"
      .\src\Parser.ps1
      Write-host "That Line"
    }
    
  3. 我什至绝望到要访问两个 ps1 文件和两个批处理文件。只能说没用。

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

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

问题

为什么某些命令在从注册事件调用时运行良好,而其他命令(如 .NET)则不起作用?

我正在努力实现的目标是否可能?

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

【问题讨论】:

    标签: .net powershell filesystemwatcher


    【解决方案1】:

    以下对我有用(代码大部分是从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()
    }
    

    【讨论】:

    • 嘿,谢谢,你告诉我这根本不是 .net 问题。我发现我的线路出现错误并停止。此外,既然我终于让它全部运行了,它会输出详细的语句,但似乎它将所有 write-host 语句保存在一个堆栈中并在最后输出它们。如果我在事件之外运行它,我希望代码能够顺利处理错误并像往常一样继续运行。我尝试设置 $ErrorActionPreference = Continue 。此外,我仍在寻找有关这些过程如何工作的简单解释。由于数百个 PS 进程,我刚刚崩溃了我的工作电脑
    • 结束问题,因为原始问题已解决。只能通过在各处添加错误检查来完成这项工作。如果您有更好的解决方案,请回复。
    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多