Я пытаюсь удалить некоторые переменные в моем скрипте PowerShell, например:
#create example com object
$Excel = New-Object -ComObject Excel.Application
#do something with COM object, close COM object etc
#clear variable
get-variable | where-object { $_.Value -ne $null -And $_.Value.ToString() -eq $Excel.GetType() } | remove-variable
Но он возвращает: Вы не можете вызвать метод для выражения с нулевым значением.
в строке get-variable ....? Однако, когда я проверяю эту строку примерно так:
get-variable | where-object { $_.Value -ne $null -And $_.Value.ToString() -eq $Excel.GetType() } | Select -Property Name
Возвращает правильные данные? Я получаю такое же поведение с:
get-variable | where-object { $_.Value -ne $null -And $_.Value.ToString() -eq $Excel.GetType() } | ForEach-Object { remove-variable -Name $_.Name }
Я не могу понять, почему не работает переменная удаления? Командлет remove-variable принимает «Имя» в конвейере от «PropertyName», так что я думаю, это выглядит нормально для меня?
ОБНОВЛЕНО
Интересно, что полная ошибкаНесколько случаев этого (интересно, потому что строка должна возвращать только 3 результата, но есть 48 из этих сообщений об ошибках):
You cannot call a method on a null-valued expression.
At line:3 char:31
+ ... re-object { $_.Value -ne $null -And $_.Value.ToString() -eq $Excel.Ge ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
ТАКЖЕ
Это работает:
$vars = get-variable | where-object { $_.Value -ne $null -And $_.Value.ToString() -eq $Excel.GetType() } | Select-object -ExpandProperty Name
foreach ($var in $vars) {
remove-variable -Name $var
}
Но это не так?:
get-variable | where-object { $_.Value -ne $null -And $_.Value.ToString() -eq $Excel.GetType() } | foreach { remove-variable -Name $_.Name }