在 DSC 复合资源中使用变量
Using variables inside a DSC composite resource
我是 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 ",并且由于 Path
参数为空,对 Test-Path
的调用失败。
我已经尝试在配置之外声明 $path
变量并使用 $global
无济于事。
我错过了什么?
DSC 将脚本作为字符串存储在已编译的 mof 文件中。标准变量不会扩展,因为它不知道哪些要扩展,哪些要保留为脚本的一部分。
但是,您可以使用 using
-scope 访问脚本外部的变量。在 mof 编译期间,定义变量的代码被添加到 Test-/Set-/GetScript.
的每个脚本块的开头
If you need to use variables from your configuration script in the
GetScript, TestScript, or SetScript script blocks, use the $using:
Scope
来源:DSC Script Resources @ 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
我是 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 ",并且由于 Path
参数为空,对 Test-Path
的调用失败。
我已经尝试在配置之外声明 $path
变量并使用 $global
无济于事。
我错过了什么?
DSC 将脚本作为字符串存储在已编译的 mof 文件中。标准变量不会扩展,因为它不知道哪些要扩展,哪些要保留为脚本的一部分。
但是,您可以使用 using
-scope 访问脚本外部的变量。在 mof 编译期间,定义变量的代码被添加到 Test-/Set-/GetScript.
If you need to use variables from your configuration script in the GetScript, TestScript, or SetScript script blocks, use the $using: Scope
来源:DSC Script Resources @ 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