Как безопасно очищать переменные в именованной функции после каждой итерации блока процесса - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть функция с условными операторами, основанными на существовании созданного свойства переменной, а не на том, что это за переменная.

Какими способами можно безопасно гарантировать, что для каждой итерации блока процесса именованной функции переменные отбрасываются. Чтобы каждый проход объекта через блок процесса мог каждый раз создавать переменные.

Function TestFunction {
param (
    [Parameter(ValueFromPipeline = $true)]$PipelineValue
)
Process {

#PipelineValue may or may not have a property 1 or a property 2 
#depending on Computerlocation so the variable the must be discarded 
#each pass, or an upcoming object that passes through will eventually 
#evaluate true for both conditional statements.

$Selection = Switch ($PipelineValue.ComputerLocation) {
    "Moon" {[PsCustomObject]@{Property1 = "Moon_$($Pipelinevalue)."}}
    "Earth" {[PsCustomObject]@{Property2 = "Earth_$($Pipelinevalue)."}}
    }

if ($Selection.property1){
"Do This"
     }

if ($Selection.property2){
"Do That"
      }

}

Я думаю, что Remove-Variable будет работать, но, может быть, безопаснее вложить внутренности блока процесса в неназванную функцию? Лучше полагаться на то, как работает свойство функций в powershell, или быть более явным?

Это упрощенный пример.

1 Ответ

0 голосов
/ 07 ноября 2018

В моем $Profile есть ниже, что позволяет мне очистить все переменные, которые я создаю после запуска.

function Remove-UserVariable {
    [CmdletBinding(SupportsShouldProcess)]
    param ()
    if ($StartupVars) {
        $UserVars = Get-Variable -Exclude $StartupVars -Scope Global
        foreach ($var in $UserVars) {
            try {
                Remove-Variable -Name $var.Name -Force -Scope Global -ErrorAction Stop
                Write-Verbose -Message "Variable '$($var.Name)' has been removed."
            }
            catch {Write-Warning -Message "An error has occured. Error Details: $($_.Exception.Message)"}           
        }
    } else {Write-Warning -Message '$StartupVars has not been added to your PowerShell profile'}    
}

$StartupVars = @()
$StartupVars = Get-Variable | Select-Object -ExpandProperty Name

После этого, выполнение Remove-UserVariable удалит все переменные, объявленные ПОСЛЕ двух нижних строк, а также выбросит ошибки, если вы что-то напутали.

Подсказка: используйте параметр -Verbose, и он скажет, что переменная была удалена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...