2016-08-08 13 views
1

In Powershell, was testet if($variable)? Teste dies, wenn die Variable gesetzt ist, null ist, wahr oder etwas anderes?

+1

Es hängt von der Art der Variablen. Das ist auch in Python und JavaScript üblich, und allgemein werden Dinge, die in diesem Kontext zu $ ​​true werden, als "truthy" bezeichnet und Dinge, die in diesem Kontext zu $ ​​false werden, werden als "falsey" bezeichnet - obwohl genau das, was passiert, anders ist in verschiedenen Sprachen. In PowerShell - https://blogs.msdn.microsoft.com/powershell/2006/12/24/boolean-values-and-operators/ – TessellatingHeckler

Antwort

1

Es testet, ob die Variable wahr ist oder ob eine nicht-boolesche Variable zu true zusammengeführt werden kann. Zum Beispiel kann jede dieser return false:

$var #uninitialized 
$var = "" 
$var = $false 
$var = 0 

Jede dieser return true:

$var = "something" 
$var = $true 
$var = 1 #or any non-zero number 
+0

Vielen Dank, ich erbte einige Code mit dieser Syntax und es schien, um zu bedeuten verschiedene Dinge. Ich werde dies als beantwortet markieren, wenn ich dazu in der Lage bin. – Bob

+1

"* Es testet, ob die Variable etwas enthält *" - nicht genau; In PowerShell ist ein leeres Array $ false, aber eine leere Hashtabelle ist $ true. (Im Gegensatz zu Python, wo ein leeres Wörterbuch falsch ist). – TessellatingHeckler

+2

Dies ist eine gute Antwort, aber genauer gesagt, es testet, ob etwas '$ true' ist oder mit $ $ true' verschmolzen werden kann. Mit anderen Worten, es gibt eine implizite Umwandlung in '[bool]', so dass die Bedingung den Wert von '[bool] $ var' verwendet. Die Details, welche Werte zu "$ true" oder "$ false" ausgewertet werden, variieren, wie diese Antwort zeigt und TessellatingHeckler erweitert. – briantist

1

Powershell lose Typisierung verwendet und als Teil davon jeder Wert kann als ein bedingter Ausdruck verwendet werden. Die Logik der Bewertung von Werten auf wahr oder falsch (solche Werte werden oft als "truthy" und "falsey" bezeichnet) ist in der System.Management.Automation.LanguagePrimitives.IsTrue Funktion. Die Logik lautet wie folgt:

  • $null wird zu false ausgewertet.
  • $true und $false haben ihre übliche Bedeutung.
  • Ein numerischer Wert (int, double, decimal usw.) ist truthy, wenn es nicht Null ist.
  • Eine Zeichenfolge ist truthy, wenn sie nicht leer ist.
  • Ein Switch-Parameter wird als wahr ausgewertet, wenn er vom Aufrufer bereitgestellt wurde.
function Test 
{ 
    param ([switch]$Option) 
} 

Test # $Option evaluates to false 
Test -Option # $Option evaluates to true 

# (Technically, $Option is not bool; it is of type SwitchParameter which, 
# for almost all intents and purposes, can be used interchangeably with bool.) 
  • Eine Sammlung (implementierende IList) verwendet die folgende Logik: eine leere Auflistung Falsey ist; eine Sammlung mit nur einem Element wird zum Wahrheitswert ihres Mitglieds ausgewertet; Eine Sammlung mit zwei oder mehr Elementen ist truthy.
  • Alles andere ist truthy.

Es gibt ein paar Fallstricke:

  • Der Typ char ist kein numerischer Typ. In der Tat gibt [System.Management.Automation.LanguagePrimitives]::IsTrue([char]0) True zurück (nach dem letzten Satz); noch if([char]0) { "Truthy" } else { "Falsey" } gibt "Falsey" zurück. Ich konnte den Grund dafür nicht finden.
  • Wie oben erwähnt, wird eine Sammlung mit genau einem Element ausgewertet, indem ihr Element ausgewertet wird. Was passiert also, wenn Sie versuchen, eine Sammlung auszuwerten, die nur sich selbst enthält (oder eine rekursive oder sehr tief verschachtelte Kette von Sammlungen mit jeweils einem Element)? Für die Wissenschaft, können Sie es testen:
$array = New-Object -TypeName System.Object[] 1 # $array = new object[1] 
$array[0] = $array 
if($array) { "Truthy" } else { "Falsey" } 

(Die Antwort lautet:. Es den Prozess mit Stackoverflow abstürzt)