6

我对 PowerShell DSC 相当陌生,对此的答案可能非常明显,但我在任何地方都找不到类似的问题。

我有一个 PowerShell DSC 复合资源,可以下载一些 MSI 并运行它们。文件下载到的目录在多个地方被引用,所以我试图将它存储在一个变量中。但是,当我开始应用使用此资源的配置时,使用Start-DscConfiguration的值总是显示为空。

以下是资源示例:

Configuration xExample {

  Import-Module -ModuleName 'PSDesiredStateConfiguration'

  $path = 'C:\Temp\Installer.msi'

  Script Download {
    SetScript = { 
      Invoke-WebRequest -Uri "..." -OutFile $path 
    }
    GetScript = {
      @{ 
        Result = $(Test-Path $path)
      }
    }
    TestScript = {
      Write-Verbose "Testing $($path)"
      Test-Path $path
    }
  }
}

执行此资源时,详细输出显示“Testing”,并且Test-Path由于Path参数为空,调用失败。

我尝试$path在配置之外声明变量并使用$global无济于事。

我错过了什么?

4

1 回答 1

9

DSC 将脚本作为字符串存储在已编译的 mof 文件中。标准变量不会扩展,因为它不知道要扩展哪个以及保留哪个作为脚本的一部分。

但是,您可以使用using-scope 访问脚本之外的变量。在 mof 编译期间,定义变量的代码被添加到 Test-/Set-/GetScript 的每个脚本块的开头。

如果您需要在 GetScript、TestScript 或 SetScript 脚本块中使用配置脚本中的变量,请使用 $using: Scope

来源:DSC 脚本资源@MSDN

例子:

Configuration xExample {

  Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

  #Can also be set outside of Configuration-scriptblock
  $path = 'C:\Temp\Installer2.msi'

  Script Download {
    SetScript = { 
      Invoke-WebRequest -Uri "..." -OutFile $using:path
    }

    GetScript = {
      @{ 
        Result = $(Test-Path "$using:path")
      }
    }

    TestScript = {
      Write-Verbose "Testing $using:path"
      Test-Path "$using:path"
    }
  }
}

localhost.mof(脚本资源部分):

instance of MSFT_ScriptResource as $MSFT_ScriptResource1ref
{
ResourceID = "[Script]Download";
 GetScript = "$path ='C:\\Temp\\Installer2.msi'\n\n      @{ \n        Result = $(Test-Path \"$path\")\n      }\n    ";
 TestScript = "$path ='C:\\Temp\\Installer2.msi'\n\n      Write-Verbose \"Testing $path\"\n      Test-Path \"$path\"\n    ";
 SourceInfo = "::7::3::Script";
 SetScript = "$path ='C:\\Temp\\Installer2.msi'\n \n      Invoke-WebRequest -Uri \"...\" -OutFile $path\n    ";
 ModuleName = "PSDesiredStateConfiguration";

ModuleVersion = "1.0";

 ConfigurationName = "xExample";

};

资料来源:MSDN

于 2017-04-03T08:57:01.597 回答