Welcome › Forums › General PowerShell Q&A › An Switch inside a Switch ?
This topic contains 2 replies, has 2 voices, and was last updated by
Participant
2 years, 10 months ago.-
AuthorPosts
-
April 5, 2016 at 5:27 am #37247
I'm writing a function that looks at a status of a WMI property. The property has 3 values, Success, InProgress and Error. Its part of the SCCM namespace to check on distribution status.
I wanted to add the switch option to Continue check until completed or errored, the $persist switch.
The below works, but doesn't feel best practice. Any thoughts ?Function Get-DPStatus { Param ( [Parameter(Mandatory, ValueFromPipeline=$true, Position=1, ParameterSetName='Define Application')] [string[]]$Application, [switch]$Persist ) $WMI = @{ NameSpace = 'root\SMS\site_AAC' ClassName = 'SMS_DPGroupDistributionStatusDetails' Filter = "ContentName like '$Application'" } $DPStatus = Get-CimInstance @WMI Write-Output "`n`tChecking the distribution status of $application`n`n" $Pause = { $T = New-TimeSpan -End (Get-Date).AddHours(4) ; sleep ($T.TotalSeconds) } Foreach ($DPState in $DPStatus) { switch ($DPState.MessageState) { 1 {write-host -NoNewline "$($DPState.DPName): " ; sleep 2 ; write-host -ForegroundColor Green "[ Successful ]" } 2 { if ($Persist) { do { write-host -ForegroundColor Yellow "Please Wait $($DPState.DPName) in progress..." ; & $Pause } until ($DPState.MessageState -eq 3 -or 2) } else { write-host -NoNewline "$($DPState.DPName): " ; sleep 2 ; write-host -ForegroundColor Yellow "[ In Progress ]" } } 3 {write-host -NoNewline "$($DPState.DPName): " ; sleep 2 ; write-host -ForegroundColor Red "[ Failed ]" } } }#End of Foreach }#End of Function
-
April 5, 2016 at 6:32 am #37251
I've had a bit of a rewrite, does this look better ?
Function Get-DPStatus { Param ( [Parameter(Mandatory, ValueFromPipeline=$true, Position=1, ParameterSetName='Define Application')] [string[]]$Application, [switch]$Persist ) $WMI = @{ NameSpace = 'root\SMS\site_AAC' ClassName = 'SMS_DPGroupDistributionStatusDetails' Filter = "ContentName like '$Application'" } $DPStatus = Get-CimInstance @WMI Write-Output "`n`tChecking the distribution status of $application`n`n" Foreach ($DPState in $DPStatus) { switch ($DPState.MessageState) { 1 { write-host -NoNewline "$($DPState.DPName): " ; sleep 2 ; write-host -ForegroundColor Green "[ Successful ]" } 2 { write-host -NoNewline "$($DPState.DPName): " ; sleep 2 ; write-host -ForegroundColor Yellow "[ In Progress ]" } 3 { write-host -NoNewline "$($DPState.DPName): " ; sleep 2 ; write-host -ForegroundColor Red "[ Failed ]" } } }#End of Foreach if ($Persist) { #Set Pause $Pause = { $T = New-TimeSpan -End (Get-Date).AddHours(4) ; sleep ($T.TotalSeconds) } Foreach ($DPState in $DPStatus) { if ($DPState.MessageState -contains 2) { do { write-host -ForegroundColor Yellow "Please Wait $($DPState.DPName) in progress..." ; & $Pause } until ($DPState.MessageState -contains 1 -or 3) If ($DPState.MessageState -eq 1) { write-host -NoNewline "$($DPState.DPName): " ; sleep 2 ; write-host -ForegroundColor Green "[ Successful ]" } else { write-host -NoNewline "$($DPState.DPName): " ; sleep 2 ; write-host -ForegroundColor Red "[ Failed ]" } } } }#End of $persist switch }#End of Function
-
April 5, 2016 at 11:44 am #37253
Option 1 looks fine to me. It's perfectly valid to use a nested if statement.
-
AuthorPosts
The topic ‘An Switch inside a Switch ?’ is closed to new replies.