Solución:
Puede utilizar la forma nativa de PowerShell:
"The condition is " + (&{If($Condition) {"True"} Else {"False"}}) + "."
Pero como esto agrega muchos paréntesis y corchetes a su sintaxis, podría considerar el siguiente (probablemente uno de los más pequeños existentes) CmdLet:
Function IIf($If, $Right, $Wrong) {If ($If) {$Right} Else {$Wrong}}
Lo que simplificará su comando a:
"The condition is " + (IIf $Condition "True" "False") + "."
Agregado 2014-09-19:
He estado usando el IIf
cmdlet ahora por un tiempo, y todavía creo que hará que las sintaxis sean más legibles en muchos casos, pero como estoy de acuerdo con la nota de Jason sobre el efecto secundario no deseado de que ambos valores posibles serán evaluados incluso obviamente, solo se usa un valor, yo han cambiado el IIf
cmdlet un poco:
Function IIf($If, $IfTrue, $IfFalse) {
If ($If) {If ($IfTrue -is "ScriptBlock") {&$IfTrue} Else {$IfTrue}}
Else {If ($IfFalse -is "ScriptBlock") {&$IfFalse} Else {$IfFalse}}
}
Ahora tu podría agregar un ScriptBlock (rodeado por {}
‘s) en lugar de un objeto que no se evaluará si no es necesario como se muestra en este ejemplo:
IIf $a {1/$a} NaN
O colocado en línea:
"The multiplicative inverse of $a is $(IIf $a {1/$a} NaN)."
En caso $a
tiene un valor distinto de cero, se devuelve el inverso multiplicativo; de lo contrario, volverá NaN
(donde el {1/$a}
no se evalúa).
Otro buen ejemplo en el que hará que una sintaxis ambigua silenciosa sea mucho más simple (especialmente en caso de que desee colocarla en línea) es donde desea ejecutar un método en un objeto que potencialmente podría ser $Null
.
El nativo ‘If
‘forma de hacer esto, sería algo como esto:
If ($Object) {$a = $Object.Method()} Else {$a = $null}
(Tenga en cuenta que el Else
a menudo se requiere una pieza en, por ejemplo, bucles en los que deberá restablecer $a
.)
Con el IIf
cmdlet se verá así:
$a = IIf $Object {$Object.Method()}
(Tenga en cuenta que si el $Object
es $Null
, $a
se establecerá automáticamente en $Null
si no $IfFalse
se proporciona el valor.)
Agregado 2014-09-19:
Pequeño cambio en el IIf
cmdlet que ahora establece el objeto actual ($_
o $PSItem
):
Function IIf($If, $Then, $Else) {
If ($If -IsNot "Boolean") {$_ = $If}
If ($If) {If ($Then -is "ScriptBlock") {&$Then} Else {$Then}}
Else {If ($Else -is "ScriptBlock") {&$Else} Else {$Else}}
}
Esto significa que puede simplificar una declaración (a la manera de PowerShell) con un método en un objeto que potencialmente podría ser $Null
.
La sintaxis general para esto ahora será $a = IIf $Object {$_.Method()}
. Un ejemplo más común se verá así:
$VolatileEnvironment = Get-Item -ErrorAction SilentlyContinue "HKCU:Volatile Environment"
$UserName = IIf $VolatileEnvironment {$_.GetValue("UserName")}
Tenga en cuenta que el comando $VolatileEnvironment.GetValue("UserName")
normalmente resultará en un “No se puede llamar a un método en una expresión de valor nulo”. error si el registro en cuestión (HKCU:Volatile Environment
) no existe; donde el comando IIf $VolatileEnvironment {$_.GetValue("UserName")}
volverá $Null
.
Si el $If
el parámetro es una condición (algo así como $Number -lt 5
) o forzado a una condición (con el [Bool]
Escribe el IIf
cmdlet no anulará el objeto actual, por ejemplo:
$RegistryKeys | ForEach {
$UserName = IIf ($Number -lt 5) {$_.GetValue("UserName")}
}
O:
$RegistryKeys | ForEach {
$UserName = IIf [Bool]$VolatileEnvironment {$_.OtherMethod()}
}
Agregado 2020-03-20:
Usando la sintaxis del operador ternario
PowerShell 7.0 introdujo una nueva sintaxis mediante el operador ternario. Sigue la sintaxis del operador ternario de C #:
El operador ternario se comporta como el simplificado
if-else
declaración. los<condition>
La expresión se evalúa y el resultado se convierte a un valor booleano para determinar qué rama debe evaluarse a continuación:los
<if-true>
La expresión se ejecuta si la<condition>
la expresión es verdadera La<if-false>
La expresión se ejecuta si la<condition>
la expresión es falsa
Ejemplo:
"The multiplicative inverse of $a is $($a ? (& {1/$a}) : 'NaN')."
Powershell 7 permite a los operadores ternarios:
$message = (Test-Path $path) ? "Path exists" : "Path not found"
Versiones anteriores: PowerShell devuelve valores que no se han asignado.
$a = if ($condition) { $true } else { $false }
Ejemplo:
"The item is $(if ($price -gt 100) { 'expensive' } else { 'cheap' })"
Probémoslo:
$price = 150
The item is expensive
$price = 75
The item is cheap
'The condition is {0}.' -f ('false','true')[$condition]