Búsqueda de sitios web

Comprender el operador ternario de PowerShell 7


He estado escribiendo y enseñando PowerShell desde el principio. Mi enfoque siempre ha sido facilitar a los profesionales de TI el uso de PowerShell en su trabajo diario para hacer la vida más fácil y avanzar en sus carreras. Sin duda, este enfoque ha sido un desafío a medida que el lenguaje ha evolucionado a lo largo de los años. Con PowerShell 7, esto continuará. Microsoft está agregando muchas funciones nuevas a la próxima versión de PowerShell. Me parece que muchas de estas funciones están diseñadas para satisfacer las necesidades de Microsoft. Una cosa que me queda más clara con cada nueva versión es que PowerShell ahora es muchas cosas para muchas personas. Es como el proverbial elefante descrito por un grupo de ciegos; significa algo diferente dependiendo de lo que estés tocando.

Conozca al operador ternario

Una de las adiciones a la última versión preliminar de PowerShell 7 es el operador ternario. Si tu experiencia es como la mía, estarás diciendo: "¿The Whatery?" Según Wikipedia, este es un término informático bien establecido. El operador permite crear una declaración condicional concisa.

<if some condition is true> ? <this>:<else this>

Usar este operador en PowerShell 7 significa que puede escribir una expresión de PowerShell como esta:

$IsWindows ? "ok":"not ok"

La alternativa tradicional de la declaración If sería:

if ($IsWindows) {
    "ok"
}
else {
    "not ok"
}

En algunos aspectos, el operador ternario no es tan complicado de entender. Aunque hay una diferencia importante. Cuando se utiliza una declaración If, la cláusula Else es completamente opcional. Cuando se utiliza el operador ternario, se requiere el componente Else condicional.

Aquí hay una declaración tradicional If/Else.

if ($IsWindows) {
    Get-CimInstance -ClassName win32_service -filter "name='bits'"
}
else {
    Write-Warning "This command requires Windows"
}

Usando el nuevo operador ternario lo escribirías así:

$IsWindows ? (Get-CimInstance -ClassName win32_service -filter "name='bits'") : (Write-Warning "This command requires Windows")

El operador ternario parece útil para declaraciones condicionales simples. Considere este código tradicional.

if ($IsWindows) {
    Get-CimInstance -ClassName win32_service -filter "name='bits'"
    Get-CimInstance -ClassName win32_service -filter "name='wsearch'"
}
else {
    Clear-Host
    Get-Date
    Write-Warning "This command requires Windows"
}

Comparado con la versión del operador ternario.

$IsWindows ? (Get-CimInstance -ClassName win32_service -filter "name='bits'"), (Get-CimInstance -ClassName win32_service -filter "name='wsearch'") : (Clear-Host),(Get-Date),(Write-Warning "This command requires Windows")

Funciona pero me parece un poco torpe.

Admito que este es un ejemplo un poco artificial. Y en caso de que se lo pregunte, por lo que he visto, no hay ninguna ventaja de rendimiento entre usar If/Else o el operatorio ternario.

Si el objetivo es ser conciso, a PowerShell no le importa el formato. Estas dos declaraciones tienen el mismo resultado.

if ($IsLinux) { ls -al } else { Write-Warning "This command requires Linux" }
$isLinux ? (ls -al) : (Write-Warning "This command requires Linux")

¿Cual prefieres?

¿Qué significa esto para usted?

No espero que Microsoft respalde este operador a versiones anteriores de PowerShell. Lo que significa que depende de PowerShell 7 si desea utilizarlo. Para declaraciones condicionales simples en la consola, supongo que puedo ver el atractivo.

Pero si estás escribiendo un archivo de script, todavía no veo ninguna ventaja. Esta es una característica nueva que mucha gente no entenderá al principio. Personalmente, algo como esto es más claro.

if ((get-date).DayOfWeek -eq "Friday") {
 $var = "tgif"
 } 
 else {
 $var = "blah"         
}

Incluso si eres nuevo en PowerShell, no hay mucho misterio sobre lo que está sucediendo.

Todo esto no significa que te esté diciendo que evites utilizar este operador. No vengo de un desarrollador, por lo que este operador no es algo que me haya perdido y la declaración If tradicional funciona bien para mí.

Como no tengo experiencia en desarrollo, si hay casos de uso atractivos para este operador, me encantaría conocerlos porque apuesto a que implicará algo nuevo que aún no he aprendido. Para el resto de ustedes que tienen PowerShell 7 preliminar 4 o posterior instalado, prueben el nuevo operador y vean dónde tiene sentido para ustedes.

Actualizar

Al parecer, Adam Bertram y yo estamos en la misma página estos días. Aquí está su opinión publicada hoy en Petri.com https://www.petri.com/using-the-ternary-conditional-operator-in-powershell-7

Artículos relacionados