【问题标题】:Can I have dynamic variables in DSC File resource我可以在 DSC 文件资源中有动态变量吗
【发布时间】:2015-04-21 05:56:05
【问题描述】:

如何在运行时获取所需状态配置的文件资源以确定它的 $DestinationPath? 这似乎仅在生成 mof 文件时设置。

下面的脚本显示了我正在尝试做的事情。我知道为什么它不起作用,但我不知道如何使它起作用。

脚本查看目标计算机上的 PSModulePath 变量并从变量中提取单个路径。我想将此路径传递给脚本中的文件资源,以在该路径中安装一些自定义 Powershell 模块。

我使用变量 $LocalInstallPath 但这不起作用,因为它是在创建 mof 文件时在文件资源中设置的。尝试设置为环境变量,但同样的问题。

有没有办法做到这一点?

Configuration InstallCustomPowershellModules
{
    param($MachineName)

    Node $MachineName
    {
        $CustomModuleSource = '\\fileserver\modules\Module1'

        Script GetLocalPath
        {
            SetScript = { 
                $FullPath = [Environment]::GetEnvironmentVariable("PSModulePath", "Machine")
                $SplitPath = $FullPath -split ";"
                foreach ($ShortPath in $SplitPath)
                {
                    $result = Select-String -Pattern 'system32' -InputObject $ShortPath
                    if($result -ne $null)
                    {
                        break
                    }
                }
                $LocalInstallPath = $ShortPath
            }

            TestScript = { $false }
            GetScript  = { $true }         
        }


       File InstallCustomModule
        {
           Ensure = 'Present'
           Type = 'Directory'
           SourcePath = $CustomModuleSource
           DestinationPath = $LocalInstallPath
           Force = $true
           Recurse = $true
        }
    }
}

【问题讨论】:

    标签: powershell runtime dsc


    【解决方案1】:

    我们(尚)不支持在运行时扩展环境变量。因此,您唯一的选择是使用脚本资源进行复制

    【讨论】:

      【解决方案2】:

      无需单独的脚本块即可获得$LocalInstallPath

      $LocalInstallPath = $env:PSModulePath.Split(';')|?{$_ -like '*system32*'} | select -First 1
      

      所以

      File InstallCustomModule
              {
                 Ensure = 'Present'
                 Type = 'Directory'
                 SourcePath = $CustomModuleSource
                 DestinationPath = $env:PSModulePath.Split(';')|?{$_ -like '*system32*'} | select -First 1
                 Force = $true
                 Recurse = $true
              }
      

      附言我没有在您的场景中测试此代码,希望这会起作用。

      【讨论】:

      • 谢谢。该命令的语法工作正常,我将使用它。不幸的是,它仍然在 mof 文件的编译时扩展,即在我创建脚本的机器上,而不是运行它的机器上。虽然这条路径很可能在任何地方都是相同的,但这并不能保证,也不能保证未来,所以我希望在运行时而不是编译时获得 $DestinationPath 的 as 扩展。
      • 我想出的唯一解决方法是在脚本块内复制文件,如SetScript = {$LocalInstallPath = $env:PSModulePath.Split(';')|?{$_ -like '*system32*'} | select -First 1; cp $CustomModuleSource $LocalInstallPath}
      • 这也是我的解决方法。我现在正在尝试的是创建自己的专用目录并将其添加到 PSModulePath,然后使用 File 资源来处理传输。这会很有效,因为我们将开发许多模块。
      猜你喜欢
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多