Unable to Set Module PrivateData within DSC

I’m having a real problem with a DSC Resource i’m writing. I have a module split into various script files that get import from the psd1(NestedModules). Everything seemingly works accept that I can’t set data stored in the PrivateData object of the psd1. From PowerShell elsewhere the command works fine, for example:

$script:ModuleData = [ref]$MyInvocation.MyCommand.Module.PrivateData
Write-verbose $ModuleData.Value['Setting']
#Prints true
$ModuleData.Value['Setting'] = $false

In PowerShell the value is set fine and can be called again within or outside the module. However in DSC I get a Cannot index into a null array when setting the value but it can still be called.

Help would be much appreciated.

Ok, so you’re writing a custom resource?

Either way, is the Private Data read only? If so, can it simply be copied to another variable or something?

Yes its a custom script resource that I am writing. The object shouldn’t be readonly and the error “Cannot index into a null array” would not indicate that. If I make a copy of the variable I have no doubt that I would be able to set it but I was to be able to set the actual PSData so that it can be accessed by other scripts running on that machine. For full disclosure I will explain my solution more thoroughly.

I have already written various DSC Resources to perform CRUD actions in VMware such as create VMs, datastores, dvports etc. In the first few versions of the resource I have common functions residing in every dscresource script for example connect-vcenter would be in vmwarevm, vmwarenetwork and vmwaredisk resources. To check whether I was already connected or not I had the state saved as a Boolean in the globalscope. I thought a lot of these things were bad practice so I separated the functions into various module and loaded them within nestedmodules of the psd1. Instead of making boolean public I wanted to store it in the PrivateData. Like I said before I have used this for other cases when its simply a script that’s getting executed but when I try to set it in DSC it just doesn’t work. I thought it may be that DSC doesn’t support reference variables but trying to set it directly like below doesn’t work either…

(Get-Module Module1 -ListAvailable).PrivateData.Value['Setting'] = $true

DSC Resources must be different. Maybe they load modules differently? Is it possible to use the $using: scope? I don’t know if that will work between Resources, or if you need it to. Since I don’t know the exact code, it’s just a guess.

With the $Using scope, you can at least store a variable safely within a Resource while it runs, no?

Perhaps simply run a check at the start of each resource to check on the connection and set it? That’s the best I have at this point.

Thanks for you comments. I used the Debugger to step through the resource as it was running and it wasn’t importing the whole module only the individual psm1. That became a problem when it tried to load the PrivateData because since the psd1 was never imported the PrivateData was never available under $MyInvocation.MyCommand.Module.PrivateData. After fully qualifying I was able to get and set the data I just now have a problem that its not seeing commands from a module I’m importing from my Base Module. A real pain but one I hopefully solve by simplying stepping through the code and analyzing as which points its available and at which not

“I just now have a problem that its not seeing commands from a module I’m importing from my Base Module.”

DSC is still experimental and not working great. :frowning:

Ryan, can you share you resource?