Использование Test-Path для поиска значения в хеш-таблице

Я недавно начал использовать Set-StrictMode чтобы лучше разбираться в скриптовых привычках (т.е. объявлять переменные и тому подобное), и я столкнулся с небольшой проблемой. Для большинства моих скриптов я создам хеш-таблицу $Script = @{} и затем объявите все переменные, используемые в скрипте, как подчиненные свойства под этим, потому что, независимо от того, что, когда вы запустите скрипт, все переменные будут чистыми, и если вы распечатаете все переменные в конце вашего скрипта, вы знаете, что они будут из этой конкретной сессии.

Исторически, если бы мне нужно было увидеть, если подвариабельная, такая как $Script.RunOnce было объявлено, что я просто буду использовать If ($Script.RunOnce) {} но в строгом режиме вы должны сделать что-то вроде этого If (Test-Path Variable:\Script.WriteOnce) {} кроме test-path видит "Script.WriteOnce" как свою собственную переменную, а не под переменные ниже $Script

Почему мне нужно это сделать, спросите вы? Ну, я пишу функцию, которая использует.Net Streamwriter, и я хочу убедиться, что если переменная "$WriteTee.StreamWriter" существует, запустите $WriteTee.StreamWriter.Close а также $WriteTee.StreamWriter.Flush до объявления $Write-Tee снова или иначе, когда я пытаюсь открыть новый потоковый модуль, он выдаст ошибку, и мне придется вручную закрыть дескриптор.net файла, прежде чем я смогу продолжить тестирование сценария.

Короче
Есть ли способ проверить $WriteTee.StreamWriter с помощью Test-Path или каким-либо другим способом, который не создает ошибку с Set-Strictmode

Супер распотрошенный пример версии моего сценария.

Set-StrictMode -Version Latest
$ErrorActionPreference = 'Inquire'

Function Write-Tee {
    Begin {
        #Variables that are needed only the first time the log function is started.
        If ($WriteTee.RunOnce) {
            If ($WriteTee.StreamWriter) { Write-Tee -Severity Error -Message "Log Writer Already Open. Attempting to close." -Close}
            New-Variable -ErrorAction SilentlyContinue -Force -Name WriteTee -Value @{} -Scope Script
            $Script:WriteTee.RunOnce = $True
        }
    }#End-Begin

    Process {}#End-Process
    End {
        If ($Close -AND $Script:WriteTee) {
            Write-Tee -Severity Info -Message "Flushing Log Writer and closing."
            $WriteTee.StreamWriter.Flush()
            $WriteTee.StreamWriter.Close()
            Remove-Variable -ErrorAction SilentlyContinue -Force -Name WriteTee -Scope Script
            Remove-Variable -ErrorAction SilentlyContinue -Force -Name WriteTee
        }#End-If
    }#End-End
}

Write-Tee -Message "Test" -Severity "Warning"

1 ответ

Решение

Вы можете использовать test-path с поставщиком переменной и именем переменной, чтобы выяснить, была ли назначена переменная, но для поиска свойств переменной (или элементов в хеш-таблице, неясно, с чем вы имеете дело) требуется другая тактика: чтобы узнать, есть ли в хеш-таблице элемент с ключом, вы можете сделать что-то вроде:

$writeTee.ContainsKey('StreamWriter')   #returns $true or $false

Чтобы узнать, имеет ли переменная определенное свойство, вы можете использовать get-member:

$writeTee | Get-Member -name StreamWriter   #returns the member or nothing
Другие вопросы по тегам