переменная удаления и конвейер - нулевое выражение? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь удалить некоторые переменные в моем скрипте 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 }

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Com-объекты должны быть освобождены из памяти с помощью:

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

После этого удалите саму переменную с помощью

$Excel = $null
Remove-Variable -Name Excel

Remove-Variable, также имеет параметр -Include, гдеВы можете указать массив имен переменных. Подстановочные знаки также разрешены там.

0 голосов
/ 30 октября 2019

В конце я исправил это, добавив больше нулевых проверок в часть объекта where в конвейере (спасибо @ScottHeath):

get-variable | where-object { $null -ne $_ -And $null -ne $_.Value -And $null -ne $Excel -And $_.Value.ToString() -eq $Excel.GetType().ToString() } | foreach { Remove-Variable -Name $_.Name }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...