{"id":273224,"date":"2022-09-26T16:31:27","date_gmt":"2022-09-26T14:31:27","guid":{"rendered":"https:\/\/www.borncity.com\/blog\/?p=273224"},"modified":"2022-09-27T08:20:36","modified_gmt":"2022-09-27T06:20:36","slug":"windows-batch-dateien-seltsames-verhalten-des-if-befehls","status":"publish","type":"post","link":"https:\/\/borncity.com\/blog\/2022\/09\/26\/windows-batch-dateien-seltsames-verhalten-des-if-befehls\/","title":{"rendered":"Windows Batch-Dateien: Seltsames Verhalten des IF-Befehls"},"content":{"rendered":"<p><img decoding=\"async\" style=\"float: left; margin: 0px 10px 0px 0px; display: inline;\" title=\"Windows\" src=\"https:\/\/borncity.com\/blog\/wp-content\/uploads\/2021\/04\/Windows-klein.jpg\" alt=\"Windows\" width=\"200\" align=\"left\" \/>[<a href=\"https:\/\/borncity.com\/win\/2022\/09\/27\/windows-batch-files-strange-behavior-of-the-if-command\/\" target=\"_blank\" rel=\"noopener\">English<\/a>]Blog-Leser Frank hat mich auf ein Problem unter Windows aufmerksam gemacht, zu dem ich keine wirkliche Erkl\u00e4rung habe. Urspr\u00fcnglich ging es darum, dass der IF-Befehl in Batch-Dateien bei Vergleichen falsche Werte zur\u00fcck lieferte. Also hat Frank das Ganze noch mit der PowerShell getestet und dort \u00e4hnliches festgestellt. Nur ein Testprogramm, verfasst mit VB .NET liefert die erwarteten Ergebnisse. Da das Batch-Programm auch unter Windows 7 die gleichen, fehlerhaften, Ergebnisse liefert, gehe ich mal davon aus, das Frank und ich da irgend etwas \u00fcbersehen habe. Ich stelle das Problem mal hier im Blog ein &#8211; vielleicht f\u00e4llt einem Leser etwas auf.<\/p>\n<p><!--more--><\/p>\n<h2>Problem: Fehlerhafte Batch-Auswertung<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg05.met.vgwort.de\/na\/c3033dc0f76e4c4e96b241c86932d1e3\" alt=\"\" width=\"1\" height=\"1\" \/>Blog-Leser Frank S. hat mich k\u00fcrzlich per E-Mail kontaktiert und schrieb mir von seinem Problem in der Verwendung des IF-Befehls bei Batch-Dateien. Frank schrieb:<\/p>\n<blockquote><p>ich stolpere dauernd \u00fcber seltsame Sachen in Windows. Heute wollte ich ein Batch-Programm implementieren, bei dem ich Buchstaben auf \u201eGr\u00f6\u00dfer\" oder \u201eKleiner\" vergleichen muss. Dabei k\u00f6nnen sowohl Klein-, als auch Gro\u00dfbuchstaben vorkommen.<\/p>\n<p>Das Programm verhielt sich v\u00f6llig absurd, so dass ich der Sache auf den Grund ging und schlie\u00dflich feststellte, dass der \u201eif\"-Befehl mit den erweiterten Vergleichsbefehlen sich so verh\u00e4lt, als ob ich die Option \u201e\/I\" verwendet h\u00e4tte, was ich nicht habe. Ich habe hier ein kleines Beispielprogramm erstellt, dass das seltsame Verhalten zeigt.<\/p><\/blockquote>\n<p>Frank hat mir den nachfolgenden Quellcode des Batch-Scripts mitgeliefert.<\/p>\n<pre><code>\r\n@echo off\r\nsetlocal enableextensions\r\nif A == a (\r\necho A == a : True [Wrong!]\r\n) else (\r\necho A == a : False [OK]\r\n)\r\nif A EQU a (\r\necho A EQU a : True [Wrong!]\r\n) else (\r\necho A EQU a : False [OK]\r\n)\r\nif A LSS b (\r\necho A LSS b : True [OK]\r\n) else (\r\necho A LSS b : False [Wrong!]\r\n)\r\nif A LEQ b (\r\necho A LEQ b : True [OK]\r\n) else (\r\necho A LEQ b : False [Wrong!]\r\n)\r\nif A GTR b (\r\necho A GTR b : True [Wrong!]\r\n) else (\r\necho A GTR b : False [OK]\r\n)\r\nif A GEQ b (\r\necho A GEQ b : True [Wrong!]\r\n) else (\r\necho A GEQ b : False [OK]\r\n)\r\nif a LSS B (\r\necho a LSS B : True [Wrong!]\r\n) else (\r\necho a LSS B : False [OK]\r\n)\r\nif a LEQ B (\r\necho a LEQ B : True [Wrong!]\r\n) else (\r\necho a LEQ B : False [OK]\r\n)\r\nif a GTR B (\r\necho a GTR B : True [OK]\r\n) else (\r\necho a GTR B : False [Wrong!]\r\n)\r\nif a GEQ B (\r\necho a GEQ B : True [OK]\r\n) else (\r\necho a GEQ B : False [Wrong!]\r\n)\r\nif Z LSS a (\r\necho Z LSS a : True [OK]\r\n) else (\r\necho Z LSS a : False [Wrong!]\r\n)\r\nif ALPHA LSS alpha (\r\necho ALPHA LSS alpha : True [OK]\r\n) else (\r\necho ALPHA LSS alpha : False [Wrong!]\r\n)\r\nif ALPHA LEQ alpha (\r\necho ALPHA LEQ alpha : True [OK]\r\n) else (\r\necho ALPHA LEQ alpha : False [Wrong!]\r\n)\r\nif ALPHA GTR alpha (\r\necho ALPHA GTR alpha : True [Wrong!]\r\n) else (\r\necho ALPHA GTR alpha : False [OK]\r\n)\r\nif ALPHA GEQ alpha (\r\necho ALPHA GEQ alpha : True [Wrong!]\r\n) else (\r\necho ALPHA GEQ alpha : False [OK]\r\n)\r\nPause<\/code><\/pre>\n<p>Frank schrieb dazu, dass er diese Batch-Datei unter Windows 10 mit dem neuesten Patch-Stand (V10.0.19044.2006) ausgef\u00fchrt und folgende Ausgabe erhalten habe.<\/p>\n<pre><code>\r\nA == a : False [OK]\r\nA EQU a : False [OK]\r\nA LSS b : True [OK]\r\nA LEQ b : True [OK]\r\nA GTR b : False [OK]\r\nA GEQ b : False [OK]\r\na LSS B : True [Wrong!]\r\na LEQ B : True [Wrong!]\r\na GTR B : False [Wrong!]\r\na GEQ B : False [Wrong!]\r\nZ LSS a : False [Wrong!]\r\nALPHA LSS alpha : False [Wrong!]\r\nALPHA LEQ alpha : False [Wrong!]\r\nALPHA GTR alpha : True [Wrong!]\r\nALPHA GEQ alpha : True [Wrong!]<\/code><\/pre>\n<p>Die <em>Extended<\/em>-Vergleiche ignorieren die Gro\u00df- oder Kleinschreibweise. Das Zeichen a ist in ANSI und Unicode numerisch gr\u00f6\u00dfer, als ein B oder ein A. Frank schreibt, dass sich die Befehle so verhalten, als ob die Option \/I angegeben worden w\u00e4re. Allerdings ist unklar, warum <em>ALPHA GTR alpha<\/em> das Ergebnis <em>True<\/em> ergibt. Einzig die Vergleiche == und EQU verhalten sich korrekt.<\/p>\n<p><img decoding=\"async\" title=\"IF-Vergleich\" src=\"https:\/\/i.imgur.com\/bJ6gkY2.png\" alt=\"IF-Vergleich\" \/><\/p>\n<p>Ich habe das Ganze unter Windows 7 SP1 laufen lassen und erhalte das gleiche Ergebnis &#8211; es h\u00e4ngt also nicht von Windows 10 ab. Da muss irgend ein Denkfehler vorliegen. Frank schrieb mir auf die Frage nach einem Denkfehler:<\/p>\n<blockquote><p>Das war auch mein erster Gedanke. Aber ich finde nichts. Ich habe das Ganze jetzt mit 3 verschiedenen Programmiersprachen getestet:<\/p>\n<p>1. Batch<br \/>\n2. PowerShell<br \/>\n3. VB .NET<\/p>\n<p>Die beiden Skript-Sprachen liefern beide dasselbe falsche Ergebnis. Es ist also kein Problem von Batch allein. VB .NET macht es richtig.<\/p><\/blockquote>\n<p>Hier noch die Quelltexte der betreffenden Testprogramme, die die Ergebnisse mit einer Kodierung f\u00fcr CodePage850 in ein Ausgabefenster schreiben.<\/p>\n<p><strong>Batch-Programm<\/strong><\/p>\n<pre><code>@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nset alphabet=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c4\u00d6\u00dc\u00e4\u00f6\u00fc\u00df\r\n\r\nset pos=0\r\n\r\n:mainLoop\r\n\r\nset char=!alphabet:~%pos%,1!\r\n\r\nif A%char% == A goto :endProc\r\n\r\necho.\r\n\r\nset pos2=0\r\n\r\n:innerLoop\r\n\r\nset char2=!alphabet:~%pos2%,1!\r\n\r\nif A%char2% == A goto :nextMain\r\n\r\ncall :testChar %char% %char2%\r\n\r\nset \/a pos2=pos2+1\r\n\r\ngoto :innerLoop\r\n\r\n:nextMain\r\n\r\nset \/a pos=pos+1\r\n\r\ngoto :mainLoop\r\n\r\n:testChar\r\n\r\nif %1 lss %2 echo %1 ^&lt;\u00a0 %2\r\n\r\nif %1 leq %2 echo %1 ^&lt;= %2\r\n\r\nif %1 gtr %2 echo %1 ^&gt;\u00a0 %2\r\n\r\nif %1 geq %2 echo %1 ^&gt;= %2\r\n\r\nexit \/b\r\n\r\n:endProc<\/code><\/pre>\n<p><strong>PowerShell-Script<\/strong><\/p>\n<pre><code>function Test-Char\r\n{\r\nParam\r\n(\r\n[Parameter(Mandatory=$true, Position=0)]\r\n[string] $Char1,\r\n[Parameter(Mandatory=$true, Position=1)]\r\n[string] $Char2\r\n)\r\nif ($Char1 -clt $Char2) {\r\nWrite-Output \"$Char1 &lt;  $Char2\"\r\n}\r\nif ($Char1 -cle $Char2) {\r\nWrite-Output \"$Char1 &lt;= $Char2\" } if ($Char1 -cgt $Char2) { Write-Output \"$Char1 &gt;  $Char2\"\r\n}\r\nif ($Char1 -cge $Char2) {\r\nWrite-Output \"$Char1 &gt;= $Char2\"\r\n}\r\n}\r\n$PSDefaultParameterValues['Out-File:Encoding'] = 'oem'\r\n$alphabet=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c4\u00d6\u00dc\u00e4\u00f6\u00fc\u00df\"\r\nfor($pos1=0; $pos1 -lt $alphabet.Length; $pos1++) {\r\nWrite-Output \"\"\r\nfor($pos2=0; $pos2 -lt $alphabet.Length; $pos2++) {\r\nTest-Char $alphabet.Substring($pos1, 1) $alphabet.Substring($pos2, 1)\r\n}\r\n}\r\n<\/code><\/pre>\n<p><strong>VB .NET<\/strong><\/p>\n<pre><code>\r\nImports System\r\nModule Program\r\nSub Main(args As String())\r\nDim alphabet As String = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c4\u00d6\u00dc\u00e4\u00f6\u00fc\u00df\"\r\nFor pos1 As Integer = 0 To alphabet.Length - 1\r\nConsole.WriteLine()\r\nFor pos2 As Integer = 0 To alphabet.Length - 1\r\nTestChar(alphabet.Substring(pos1, 1), alphabet.Substring(pos2, 1))\r\nNext pos2\r\nNext pos1\r\nEnd Sub\r\nPrivate Sub TestChar(char1 As String, char2 As String)\r\nIf char1 &lt; char2 Then _\r\nConsole.WriteLine($\"{char1} &lt;  {char2}\")\r\nIf char1 &lt;= char2 Then _\r\nConsole.WriteLine($\"{char1} &lt;= {char2}\") If char1 &gt; char2 Then _\r\nConsole.WriteLine($\"{char1} &gt;  {char2}\")\r\nIf char1 &gt;= char2 Then _\r\nConsole.WriteLine($\"{char1} &gt;= {char2}\")\r\nEnd Sub\r\nEnd Module\r\n<\/code><\/pre>\n<p>Daher die Frage an die Leserschaft, ob jemandem ad-hoc dazu eine Erkl\u00e4rung einf\u00e4llt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[English]Blog-Leser Frank hat mich auf ein Problem unter Windows aufmerksam gemacht, zu dem ich keine wirkliche Erkl\u00e4rung habe. Urspr\u00fcnglich ging es darum, dass der IF-Befehl in Batch-Dateien bei Vergleichen falsche Werte zur\u00fcck lieferte. Also hat Frank das Ganze noch mit &hellip; <a href=\"https:\/\/borncity.com\/blog\/2022\/09\/26\/windows-batch-dateien-seltsames-verhalten-des-if-befehls\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[301],"tags":[24,3288],"class_list":["post-273224","post","type-post","status-publish","format-standard","hentry","category-windows","tag-problem","tag-windows-en"],"_links":{"self":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts\/273224","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/comments?post=273224"}],"version-history":[{"count":0,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts\/273224\/revisions"}],"wp:attachment":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/media?parent=273224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/categories?post=273224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/tags?post=273224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}