{"id":446,"date":"2021-05-15T10:00:00","date_gmt":"2021-05-15T08:00:00","guid":{"rendered":"https:\/\/pascal-korz.de\/blog\/?p=446"},"modified":"2021-05-16T15:26:51","modified_gmt":"2021-05-16T13:26:51","slug":"powershell-fallen-4-wenn-aepfel-birnen-gleichen-aber-birnen-nicht-aepfeln","status":"publish","type":"post","link":"https:\/\/pascal-korz.de\/blog\/2021\/05\/15\/powershell-fallen-4-wenn-aepfel-birnen-gleichen-aber-birnen-nicht-aepfeln\/","title":{"rendered":"PowerShell-Fallen #4: Wenn \u00c4pfel Birnen gleichen, aber Birnen nicht \u00c4pfeln"},"content":{"rendered":"\n<p>Mit dem Gleichheitsoperator <code>-eq<\/code> werden in PowerShell zwei Operanden auf Gleichheit \u00fcberpr\u00fcft, wie man es in den meisten anderen Programmiersprachen mit <code>==<\/code> unternimmt. A == B entspr\u00e4che darum notwendigerweise B == A.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Type Casting, mal wieder!<\/h2>\n\n\n\n<p>In PowerShell kann <code>$A -eq $B<\/code> aber unter Umst\u00e4nden das Gegenteil von <code>$B -eq $A<\/code> ergeben! Der Beweis folgt sogleich:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>5 -eq $true\n$true -eq $5\n\nOutput:\nFalse\nTrue<\/code><\/pre>\n\n\n\n<p>Dem mathematisch-logischen Verstand widerstrebt es zun\u00e4chst, diese Tatsache zu akzeptieren, aber sie l\u00e4sst sich wie so oft in PowerShell mit impliziter Typumwandlung erkl\u00e4ren.<\/p>\n\n\n\n<p>Der rechte Operand wird in den Typ des linken Operanden konvertiert, und erst danach wird gepr\u00fcft, ob ihre Werte gleich sind:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>5 -eq &#91;int] $true\n$true -eq &#91;bool] 5\n\nOutput:\nFalse\nTrue<\/code><\/pre>\n\n\n\n<p>Denn w\u00e4hrend <code>[bool] <\/code>jeden Integer-Wert au\u00dfer <code>0<\/code> (also auch negative Zahlen) zu <code>$true<\/code> umwandelt, ergibt <code>[int] $true<\/code> immer <code>1<\/code>.<\/p>\n\n\n\n<p>Aus demselben Grund lassen sich \u00fcbrigens auch Strings und Integers problemlos miteinander vergleichen!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>5 -eq \"5\"\n\"5\" -eq 5\n\nOutput:\nTrue\nTrue<\/code><\/pre>\n\n\n\n<p>Denn auch hier wird implizit konvertiert:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>5 -eq &#91;int] \"5\"\n\"5\" -eq &#91;string] 5\n\nOutput:\nTrue\nTrue<\/code><\/pre>\n\n\n\n<p>In manchen F\u00e4llen kann das sehr n\u00fctzlich sein, aber man sollte diese Funktionsweise immer im Hinterkopf behalten, besonders wenn man wirklich einmal auf Typgleichheit angewiesen ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Typstrenge Vergleiche<\/h2>\n\n\n\n<p>Die folgende Funktion umgeht die implizite Typumwandlung, indem zuerst der Typ der Operanden und erst danach ihr Wert verglichen wird:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function Compare {\nparam(\n$a,\n$b\n)\n\n    $(if ($a -eq $null) {$null} else {$a.GetType()}) `\n    -eq $(if ($b -eq $null) {$null} else {$b.GetType()}) `\n    -and $a -eq $b\n}\n\nCompare $true 5\nCompare 5 \"5\"\nCompare 3 3\n\nOutput:\nFalse\nFalse\nTrue<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit dem Gleichheitsoperator -eq werden in PowerShell zwei Operanden auf Gleichheit \u00fcberpr\u00fcft, wie man es in den meisten anderen Programmiersprachen mit == unternimmt. A == B entspr\u00e4che darum notwendigerweise B == A. Type Casting, mal wieder! In PowerShell kann $A -eq $B aber unter Umst\u00e4nden das Gegenteil von $B -eq $A ergeben! Der Beweis folgt&hellip; <a class=\"more-link\" href=\"https:\/\/pascal-korz.de\/blog\/2021\/05\/15\/powershell-fallen-4-wenn-aepfel-birnen-gleichen-aber-birnen-nicht-aepfeln\/\"><span class=\"screen-reader-text\">PowerShell-Fallen #4: Wenn \u00c4pfel Birnen gleichen, aber Birnen nicht \u00c4pfeln<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":6,"featured_media":429,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-446","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell","entry"],"_links":{"self":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/446","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/comments?post=446"}],"version-history":[{"count":3,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/446\/revisions"}],"predecessor-version":[{"id":513,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/446\/revisions\/513"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/media\/429"}],"wp:attachment":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/media?parent=446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/categories?post=446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/tags?post=446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}