I had previously written about an issue that I had with closing out a custom PSObject that caused scripts to fail on subsequent runs. After watching a PluralSight video that covered the concept of passing variables by reference and by value, I re-visited my issue. Initially, I was trying to solve the issue by capturing the variable name and using that name to call:
Remove-Variable -Name 'VariableName'
Although Remove-Variable requires a name to remove the variable, I was going about identifying the name of variable the wrong way. Since the $this variable in the custom PSObject is going to reference the same object as the variable I assigned it to in my scripts I could leverage System.Object.ReferenceEquals() method to identify the variables. My new Close() method for my PSLogging module looks like this:
$tmpVars = Get-Variable -Scope Global | Where-Object{ [System.Object]::ReferenceEquals($this, $_.Value)} if($tmpVars.GetType().FullName -eq 'System.Management.Automation.PSVariable'){ Remove-Variable -Scope Global -Name $tmpVars.Name }else{ for($i=0;$i -lt $tmpVars.Count;$i++){ Remove-Variable -Scope Global -Name $tmpVars[$i].Name } }
I can now reliably identify all references to the log variable and remove them successfully. The concepts of By Value and By Reference weren’t new to me, but I didn’t fully grasp them until watching that video.
Recent Comments