【问题标题】:Refresh PowerShell DSC resource刷新 PowerShell DSC 资源
【发布时间】:2014-01-29 19:59:06
【问题描述】:

我正在调试 v4.0 附带的 PowerShell DSC 资源。 更具体地说,我正在通过添加诊断日志来测试 MSFT_ProcessResource。 在我对资源进行更改并运行我的配置以使用该资源后,我看不到我刚刚添加的日志记录。最终,几分钟后,PowerShell 似乎刷新了它拥有的任何资源缓存。 我试过了 获取 DscResource 和 导入模块 MSFT_ProcessResource

这些都不起作用。

有没有办法强制重新加载资源?

【问题讨论】:

  • 同样的问题,你有进展吗?
  • 我发现修改系统文件夹中的资源需要重新启动WMI windows服务。或者,如果我对程序文件中的资源进行更改,更改会立即反映
  • 感谢您的反馈

标签: powershell powershell-4.0


【解决方案1】:

DSC 引擎缓存资源以提高性能。

重新加载资源有两种方式:

1) 重新启动托管 DSC 引擎的进程(杀死 WMI Provider Host 并重新运行配置)

2) 使用调试模式,这将导致 DSC 自动重新加载资源(在开发资源时很有用,但不建议用于常规工作):

LocalConfigurationManager
{
    DebugMode = $true
}

您可以在此处阅读有关调试模式的更多信息: http://blogs.msdn.com/b/powershell/archive/2014/04/22/debug-mode-in-desired-state-configuration.aspx

【讨论】:

  • 根据您提到的参考资料,这是一个 v5 功能。很适合 v5 场景,但 OP 将他们的问题标记为 powershell-4.0,所以目前可能没有帮助
【解决方案2】:
  • DSC 有一个缓存模型,坦率地说,截至 2016 年 9 月,该模型似乎有问题且设计不佳
  • 表明绕过缓存的机制的博客条目并不总是有效
  • 在您的配置中包含以下配置行
  • 同时完全重新启动 winmgt 服务。简单地终止 dsctimer 进程似乎并不总是有效。

{ LocalConfigurationManager { DebugMode = "All" } }

清除缓存的 PowerShell 脚本是:


$dscProcessID = Get-WmiObject msft_providers | 
   Where-Object {$_.provider -like 'dsctimer'} | 
   Select-Object -ExpandProperty HostProcessIdentifier 

if ($dscProcessID -eq $null) {
    Write-Host "DSC timer is not running."
    return
}
Write-Host "Process ID: $dscProcessID"

Get-Process -Id $dscProcessID | Stop-Process -Force

Restart-Service -Name winmgmt -Force -Verbose

【讨论】:

    【解决方案3】:

    现在 WMF 5 改变了这一点,而不是 $true 调试模式具有以下选项。

    • - 表示 DebugMode 为 False 且不适用。
    • ForceModuleImport - 强制重新加载资源模块而不是使用缓存。这类似于“真”值 以前的版本。
    • ResourceScriptBrealAll - 当本地配置管理器尝试执行其功能时,有助于调试 DSC 资源。更多关于 在后续的博客文章中!
    • 全部 - 表示调试和重新加载模块都已启用。

    在示例 DSC 配置中使用它如下所示:

    Configuration myChocoConfig2
    {
       Import-DscResource -Module cChoco  
       Node "localhost"
       {
          LocalConfigurationManager
          {
              DebugMode = 'All'
          }
          cChocoInstaller installChoco
          {
            InstallDir = "c:\choco"
          }
          cChocoPackageInstaller installChrome
          {
            Name = "sysinternals"
            DependsOn = "[cChocoInstaller]installChoco"
          }
    
       }
    } 
    

    https://techstronghold.com/blogs/scripting/how-to-setup-debug-mode-in-windows-powershell-desired-state-configuration-dsc

    【讨论】:

      【解决方案4】:

      我有一组在 PowerShell 启动时加载的脚本,我经常需要它们。我将编辑我的一个脚本并需要在当前会话中对其进行更新。

      因为我通过 $profile 中的一系列脚本加载了这些脚本,所以我可以使用一个命令来刷新我在 init 上加载的任何脚本。

      C:> powershell

      此命令将刷新您的会话并将您保留在当前所在的同一文件夹中。如果您在启动时未加载模块,则需要使用answer from Karol

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多