PowerShell; You cannot call a method on a null-valued expression

Permalänk

PowerShell; You cannot call a method on a null-valued expression

Har skapat ett GUI till ett av mina PowerShell script och allt fungerar klockrent när jag exekverar det från VisualStudio Code.

Men, när jag exekverar PS1-filen från en PowerShell terminal så fallerar den med följande fel;

You cannot call a method on a null-valued expression.
At C:\Users\_LOGGING.ps1:326 char:49
+ [action]{$global:var_box_log.AddText("$($Text)`n")},
+ ~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Problemet är denna delen i scriptet som uppdaterar en textbox i "realtid" under tiden scriptet körs;

<code>
### Update LogFields
function Write-FormHost {
param( [string]$Text )

$window.Dispatcher.Invoke(
[action]{$global:var_box_log.AddText("$($Text)`n")},
"Render"
)
}
</code>

De delarna av scriptet som berörs;

<code>
#### Create Window
$inputXML = Get-Content $xamlFile -Raw
$inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
[XML]$XAML = $inputXML

#Read XAML
$reader = (New-Object System.Xml.XmlNodeReader $xaml)
try {
$window = [Windows.Markup.XamlReader]::Load( $reader )
} catch {
Write-Warning $_.Exception
throw
}

# Create variables based on form control names.
# Variable will be named as 'var_<control name>'

$xaml.SelectNodes("//*[@Name]") | ForEach-Object {
#"trying item $($_.Name)"
try {
Set-Variable -Name "var_$($_.Name)" -Value $window.FindName($_.Name) -ErrorAction Stop
} catch {
throw
}
}

### Update LogFields
function Write-FormHost {
param( [string]$Text )

$window.Dispatcher.Invoke(
[action]{$global:var_box_log.AddText("$($Text)`n")},
"Render"
)
}

Write-FormHost 'Starting up'

</code>

Sista raden skriver till textboxen, och som sagt, det fungerar från VS Code, men inte från en prompt....

Det är precis som om texten inte skickas med till funktionen i det läget...

Permalänk
Medlem

Jag kan inte Powershell. Men den enda metoden som anropas är AddText, så om man ska tyda felmeddelandet så är $global:var_box_log null när felet uppstår. Lägg en null-koll och skapa objektet om det inte finns?

Alternativt får hela Invoke-anropet en null-parameter?

Permalänk
Skrivet av KAD:

Jag kan inte Powershell. Men den enda metoden som anropas är AddText, så om man ska tyda felmeddelandet så är $global:var_box_log null när felet uppstår. Lägg en null-koll och skapa objektet om det inte finns?

Alternativt får hela Invoke-anropet en null-parameter?

Jag tänkte på detta i natt också när jag satt uppe och tittade på Bollibompa med en dotter som inte ville sova

Jag skall testa när jag kommer in till kontoret igen nu på morgonen, men jag tror det är helt rätt orsak!

Permalänk

Är det Windows Forms?

#initiera forms [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms"); möjligtvis denna med: [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070