Existe-t-il un opérateur de coalescence nul dans powershell ?
J'aimerais pouvoir faire ces commandes c# dans powershell :
var s = myval ?? "new value";
var x = myval == null ? "" : otherval;
Existe-t-il un opérateur de coalescence nul dans powershell ?
J'aimerais pouvoir faire ces commandes c# dans powershell :
var s = myval ?? "new value";
var x = myval == null ? "" : otherval;
Enfin, PowerShell 7 a obtenu Opérateurs d'assignation de coalescence nuls !
PS > $null ?? "a"
a
PS > "x" ?? "y"
x
PS > $x = $null
PS > $x ??= "abc"
PS > $x
abc
PS > $x ??= "xyz"
PS > $x
abc
Je constate souvent que je dois également traiter la chaîne vide comme nulle lorsque j'utilise coalesce. J'ai fini par écrire une fonction pour cela, qui utilise Zenexer pour la coalescence simple et nulle, et a ensuite utilisé la solution de Keith Hill pour la vérification de la nullité ou de la vacuité, et je l'ai ajouté comme indicateur pour que ma fonction puisse faire les deux.
L'un des avantages de cette fonction est qu'elle gère également les éléments nuls (ou vides), sans lancer d'exception. Elle peut également être utilisée pour de nombreuses variables d'entrée arbitraires, grâce à la façon dont PowerShell gère les entrées de type tableau.
function Coalesce([string[]] $StringsToLookThrough, [switch]$EmptyStringAsNull) {
if ($EmptyStringAsNull.IsPresent) {
return ($StringsToLookThrough | Where-Object { $_ } | Select-Object -first 1)
} else {
return (($StringsToLookThrough -ne $null) | Select-Object -first 1)
}
}
Cela donne les résultats de test suivants :
Null coallesce tests:
1 (w/o flag) - empty/null/'end' :
1 (with flag) - empty/null/'end' : end
2 (w/o flag) - empty/null :
2 (with flag) - empty/null :
3 (w/o flag) - empty/null/$false/'end' :
3 (with flag) - empty/null/$false/'end' : False
4 (w/o flag) - empty/null/"$false"/'end' :
4 (with flag) - empty/null/"$false"/'end' : False
5 (w/o flag) - empty/'false'/null/"$false"/'end':
5 (with flag) - empty/'false'/null/"$false"/'end': false
Code de test :
Write-Host "Null coalesce tests:"
Write-Host "1 (w/o flag) - empty/null/'end' :" (Coalesce '', $null, 'end')
Write-Host "1 (with flag) - empty/null/'end' :" (Coalesce '', $null, 'end' -EmptyStringAsNull)
Write-Host "2 (w/o flag) - empty/null :" (Coalesce('', $null))
Write-Host "2 (with flag) - empty/null :" (Coalesce('', $null) -EmptyStringAsNull)
Write-Host "3 (w/o flag) - empty/null/`$false/'end' :" (Coalesce '', $null, $false, 'end')
Write-Host "3 (with flag) - empty/null/`$false/'end' :" (Coalesce '', $null, $false, 'end' -EmptyStringAsNull)
Write-Host "4 (w/o flag) - empty/null/`"`$false`"/'end' :" (Coalesce '', $null, "$false", 'end')
Write-Host "4 (with flag) - empty/null/`"`$false`"/'end' :" (Coalesce '', $null, "$false", 'end' -EmptyStringAsNull)
Write-Host "5 (w/o flag) - empty/'false'/null/`"`$false`"/'end':" (Coalesce '', 'false', $null, "$false", 'end')
Write-Host "5 (with flag) - empty/'false'/null/`"`$false`"/'end':" (Coalesce '', 'false', $null, "$false", 'end' -EmptyStringAsNull)
Le plus proche que je puisse avoir est : $Val = $MyVal |?? "Default Value"
J'ai mis en œuvre le opérateur de coalescence nul pour ce qui précède comme ceci :
function NullCoalesc {
param (
[Parameter(ValueFromPipeline=$true)]$Value,
[Parameter(Position=0)]$Default
)
if ($Value) { $Value } else { $Default }
}
Set-Alias -Name "??" -Value NullCoalesc
En opérateur ternaire conditionnel pourrait être mis en œuvre de manière similaire.
function ConditionalTernary {
param (
[Parameter(ValueFromPipeline=$true)]$Value,
[Parameter(Position=0)]$First,
[Parameter(Position=1)]$Second
)
if ($Value) { $First } else { $Second }
}
Set-Alias -Name "?:" -Value ConditionalTernary
Et utilisé comme : $Val = $MyVal |?: $MyVal "Default Value"
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.