Использование 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