使用具有较短条件的powershell从AD获取操作系统



是否有较短的方法来编写此powershell代码?我想知道是否有更好的方法来查询多个条件并在底部返回答案。

$PC = Read-Host -Prompt 'Give me PC name'
$OSname = $null
$OS = $null
$OS = (get-adcomputer $PC -Properties operatingSystem).OperatingSystem
If ($OS -like "Windows 10*")
{
$OSname = "Win 10"
}
If ($OS -like "*Server 2022*")
{
$OSname = "Win 2022"
}
If ($OS -like "*Server 2019*")
{
$OSname = "Win 2019"
}
If ($OS -like "*Server 2016*")
{
$OSname = "Win 2016"
}
If ($OS -like "*Server 2012*")
{
$OSname = "Win 2012"
}
If ($OS -like "Windows 7*")
{
$OSname = "Win 7"
}
If ($OS -like "*Server 2008*")
{
$OSname = "Win 2008"
}
If ($OS -eq $null)
{
$OSname = "NO OS"
}
$Osname

使用Switch语句:

$OS = "Microsoft Server 2022 NL"
$OSName = switch -wildcard ($OS) {
"Windows 10*"   { "Win 10" }
"*Server 2022*" { "Win 2022" }
"*Server 2019*" { "Win 2019" }
"*Server 2016*" { "Win 2016" }
"*Server 2012*" { "Win 2012" }
"Windows 7*"    { "Win 7" }
"*Server 2008*" { "Win 2008" }
""              { "NO OS" }
Default         { "Other" }
}
$OSName
Win 2022

@iRon的回答是正确和直接的。使用一个switch语句代替多个if语句是最好的方法。

如果您只想缩短代码,我想提供一个替代答案。这利用了使用计算属性和regex的优势

示例:

$PC = Read-Host -Prompt 'Give me PC name'
Get-ADComputer $PC -Properties OperatingSystem | Select @{L="OperatingSystem";E={
if($_.OperatingSystem -match ('([Windows]).*(?:d{1,})')){return $Matches[0] -replace "Windows", "Win" -replace "Server ", "" -replace "R2 ", ""}
else{return "Other"}
}}

最新更新