【问题标题】:Need FileSystemWatcher Event to reload modules in current working environment需要 FileSystemWatcher 事件来重新加载当前工作环境中的模块
【发布时间】:2011-12-29 15:17:47
【问题描述】:

首先,我有一个类似的问题here,但没有解决问题的方向。借助海报Andy Arismendi 的一个想法,我想出了一个可能的解决方案,这是一个新问题:

我正在运行以下脚本,它将以下代码块绑定到 FileChanged 事件。当 .psm1 模块文件发生更改时,代码块会检查文件是否已加载并尝试重新加载。如果没有,它会导入模块。但是,我认为事件与绑定事件的初始脚本正在运行的当前运行环境无关。我在代码下面列出了两个问题:

# create a FileSystemWatcher on the currect directory
$filter = '*.psm1'
$folder = $PWD
$watcher = New-object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false; EnableRaisingEvents = $true; NotifyFilter = [IO.NotifyFilters]'LastWrite'}
Register-ObjectEvent $watcher Changed -SourceIdentifier FileChanged -Action { 
    $folder = $PWD
    $name = $Event.SourceEventArgs.Name 
    $filename = $name.Remove($name.IndexOf('.'), 5)

    Write-Host $PWD

    $loadedModule = Get-Module | ? { $_.Name -eq $filename }
    write-host $filename

    if ($loadedModule) {
        write-host "Reloading Module $folder\$($filename)"
        Reload-Module $filename
    } else {
        write-host "Importing Module $folder\$($filename)"
        Import-Module .\$filename
    }
}

问题: 1) 当 .psm1 文件更改时,事件会运行两次(一次保存文件)

2) 即使它运行重新加载/导入命令,它也必须在不同的环境中运行,因为它们永远不会被加载。但所有输出都会转到脚本绑定事件的当前运行环境。

就像我提到的,我确信代码块不知何故与当前会话无关。

【问题讨论】:

  • 抱歉,在您将代码发布在其他问题上后,我没有机会尝试您的代码。你在某处有一个名为“Reload-Module”的函数吗?我问的原因是因为那不是 cmdlet。如果您没有为此定义函数,那么您需要将remove-moduleimport-moduleimport-module-force 标志配对。
  • @Andy - 我已经尝试过了,但没有更好的。我确实找到了以下内容,但不确定如何解决:blogs.msdn.com/b/powershell/archive/2008/06/11/… ...Register-*Event cmdlet 支持 -Action 脚本块。当您的事件到达时,PowerShell 将在后台调用该脚本块。这些操作在它们自己的模块中调用——它们可以获取和设置 $GLOBAL 变量,但常规变量修改发生在它们自己的隔离环境中。

标签: powershell powershell-module


【解决方案1】:

这是我加载模块的方式:

Get-Module -listavailable| foreach{Import-Module $_.name}

【讨论】:

  • 这并没有解决由于更改而自动加载的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2015-04-14
  • 2019-02-18
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多