Vergleichsoperatoren in PowerShell-Skript

Mitglied: DanielG1974
Hallo.

Ich bin gerade dabei ein PowerShell Skript zu schreiben.
Dieses Skript soll am Ende automatisiert in fast 21000 Zeichnungen (PDF-Dokumente) einen QR-Code einfügen.
Diese Funktion kommt erst viel später ins ERP-System.
Bis dahin soll das Skript dies erledigen.
Im QR-Code stehen dann einige Daten zu dem Werkstück das in der Zeichnung dargestellt wird.
Die Daten kommen aus einer exportierten Excel-Datei.

Ich werde das Skript Stück für Stück aufbauen.
Aktuell bin ich soweit, dass er die Word-Dateien erstellt.
Dabei bin ich bei dem verwendeten Vergleichsoperator "-le" über ein Problem gestolpert.
Er erstellt am Ende eine Word-Datei mehr als er soll.
Und der Zähler ist auch um eines höher als erwartet.

Hab ich hier ein Verständnisproblem mit den Vergleichsoperatoren?
Bei Verwendung von "-eq" werden keine Word-Dateien erstellt.
Obwohl ich dachte, dies wäre der richtige Vergleichsoperator...

Könne mir das eventuell jemand "Dummie"-Freundlich erklären?

Anbei der Code:

Hier noch die Ausgabe eines Durchlaufs mit "-le":

Gruß Daniel

Content-Key: 1405762826

Url: https://administrator.de/contentid/1405762826

Ausgedruckt am: 27.11.2021 um 19:11 Uhr

Mitglied: Doskias
Lösung Doskias 19.10.2021 aktualisiert um 13:14:56 Uhr
Goto Top
Zitat von @DanielG1974:

Hallo.

Ich bin gerade dabei ein PowerShell Skript zu schreiben.
Dieses Skript soll am Ende automatisiert in fast 21000 Zeichnungen (PDF-Dokumente) einen QR-Code einfügen.
Diese Funktion kommt erst viel später ins ERP-System.
Bis dahin soll das Skript dies erledigen.
Im QR-Code stehen dann einige Daten zu dem Werkstück das in der Zeichnung dargestellt wird.
Die Daten kommen aus einer exportierten Excel-Datei.

Ich werde das Skript Stück für Stück aufbauen.
Aktuell bin ich soweit, dass er die Word-Dateien erstellt.
Dabei bin ich bei dem verwendeten Vergleichsoperator "-le" über ein Problem gestolpert.
Er erstellt am Ende eine Word-Datei mehr als er soll.
Und der Zähler ist auch um eines höher als erwartet.

Hab ich hier ein Verständnisproblem mit den Vergleichsoperatoren?
Bei Verwendung von "-eq" werden keine Word-Dateien erstellt.
Obwohl ich dachte, dies wäre der richtige Vergleichsoperator...

Ohne das ganze Skript gelesen zu haben: Wenn immer eine Datei mehr erstellt wird, dann solltest du vielleicht von -le (lower equals, kleiner gleich) auf -lt (lower then, kleiner) wechseln.

for($h=0; $h -le $InputArray_ARTNR1.Length; $h++)

wenn h 0 ist und $InputArray_ARTNR1.Lengthebenfalsl 0, dann wird durch das LE die Schleife dennoch durchlaufen. bei LT würde sie nicht durchlaufen werden.

Gruß
Doskias
Mitglied: DanielG1974
DanielG1974 19.10.2021 um 13:19:25 Uhr
Goto Top
Danke!
Das war es.

Kannst Du mir bitte erklären wieso es mit "-lt" funktioniert?
Müsste er dann nicht eigentlich bei "7" Daten aufhören?
Denn 7 ist doch kleiner als 8...

Gruß Daniel
Mitglied: erikro
erikro 19.10.2021 um 13:24:52 Uhr
Goto Top
Moin,

Zitat von @DanielG1974:

Danke!
Das war es.

Kannst Du mir bitte erklären wieso es mit "-lt" funktioniert?
Müsste er dann nicht eigentlich bei "7" Daten aufhören?
Denn 7 ist doch kleiner als 8...

Gruß Daniel

Weil die Länge eines Arrays mit 1 anfängt und nicht mit 0. Das erste Element aber ist das Element 0. Also, wenn das Array zwei Elemente hat, dann hat es die Länge 2. In der ersten Schleife hat $h den Wert 0 und Du verarbeitest das erste Element mit dem Index 0. Du zählst $h eins hoch. Es steht also im zweiten Schleifendurchlauf auf 1. Du verarbeitest das zweite Element mit dem Index 1. Du zählst $h eins hoch. Es ist jetzt gleich der Länge und die Schleife wird noch einmal durchlaufen. Aber da ist kein Element im Array mehr.

BTW: Sowas kannst Du einfach vermeiden, indem Du nicht for, sondern foreach nimmst.

Liebe Grüße

Erik
Mitglied: em-pie
em-pie 19.10.2021 aktualisiert um 13:34:16 Uhr
Goto Top
Moin,
Zitat von @DanielG1974:
Kannst Du mir bitte erklären wieso es mit "-lt" funktioniert?
Müsste er dann nicht eigentlich bei "7" Daten aufhören?
Denn 7 ist doch kleiner als 8...

Gruß Daniel

Das ist einfach:
lt = less then = kleiner
le = less equals = kleiner gleich


"Zähle von x bis 8, solange x kleiner 8 ist (lt) und erhöhe mit jedem durchlauf x um einen"
vs.
"Zähle von x bis 8, solange x kleiner ODER gleich 8 ist (le) und erhöhe mit jedem durchlauf x um einen"

Bei lt erreicht x dann 8. Da 8 aber nicht mehr kleiner 8 ist, hört die Schleife auf
Bei le erreicht x dann 8. Da 8 aber gleich 8 ist, hört die Schleife noch nicht auf. Erst wenn x > 8 wird (je nach Datentyp würde sogar ein 8,0000000000000001 ausreichen), wird die Schleife beendet.

Edit:
Meines ist zwar richtig, beantwortet aber deine Frage nicht :-D face-big-smile
@erikro hat es ja schon erklärt: Länge != Array-Index


Gruß
em-pie
Mitglied: DanielG1974
DanielG1974 19.10.2021 um 13:31:26 Uhr
Goto Top
Danke @erikro für die Erklärung.
Mit foreach hatte ich es schon probiert.
Ich weiß jetzt nur, dass es damit nicht ging.
Warum weiß ich nicht mehr.
Wahrscheinlich lag der Fehler bei mir. :-) face-smile

Aber jetzt kann ich mich an die nächste Funktion machen.

Gruß Daniel
Heiß diskutierte Beiträge
question
Windows Server 2019 AD MigrationjamesbrownVor 1 TagFrageWindows Server9 Kommentare

Hallo zusammen Langsam habe ich Panik, die komplette Domäne zerschossen zu haben. Bevor ich weiter vergehe, wollte ich darum hier um Rat bitten. Was ist ...

question
Mobilfunk-Internet ins Heimnetzwerk integrieren? gelöst AvarianVor 1 TagFrageNetzwerkmanagement8 Kommentare

Hallo, Ich bin neu hier. Wir sind vorletztes Jahr umgezogen. Die Gelegenheit habe ich damals direkt genutzt, um künftig auf wackelige WLAN-Lösungen (Repeater, Mesh-Repeater, Powerlines ...

general
Sicherheit beim Online-BankingWeyershausenVor 13 StundenAllgemeinSicherheitsgrundlagen18 Kommentare

Hallo, in unserer Firma verwenden wir SFirm als Online-Banking-Software. In dieser Woche hatten wir einen IT-Berater bei uns, der uns dringend folgendes Vorgehen empfahl: Wir ...

question
Maximale Empfänger bei Office365 gelöst mmpmmpVor 1 TagFrageMicrosoft Office11 Kommentare

Hallo, ich verwende nun Office365 (Exchange Online) für Emails und würde gerne die Weihnachtsgrüße per Mail versenden. Wo liegen die Beschränkungen der maximalen Empfänger? ...

report
Mailversand durch Sophos XG gestört (25.11.2021)kgbornVor 1 TagErfahrungsberichtFirewall2 Kommentare

Kurze Information - vielleicht hat jemand eine ähnliche Beobachtung gemacht. Ein IT-Admin hat mich darauf hingewiesen, dass es wohl gestern (25.11.2021) ein Update des Antivirus-Pattern ...

question
Treuhand für ebay-Verkäufer, die nicht direkt nach D. liefernDerWoWussteVor 1 TagFrageHardware4 Kommentare

Moin Kollegen, es gibt ja Fälle, wo man alte Hardware benötigt, aber nur noch über ebay bekommt. Wenn der Verkäufer dann aber nicht nach Deutschland ...

question
Reinigung der Apple Watch gelöst honeybeeVor 1 TagFrageApple6 Kommentare

Hallo, mit welchem Reinigungsmittel kann ich das Armband meiner Apple Watch schonend reinigen? Auf dem Bild seht ihr, dass es in einem guten Zustand ist. ...

question
Über das Notebook per Simkarte von unterwegs aus ins Internet?isarc01Vor 1 TagFrage5G, 4G, LTE, UMTS, EDGE & GPRS8 Kommentare

Hallo, folgende Frage: Wenn ich über mein Notebook über eine angemeldete SIM Karte mit einer Datenflatrate ins Internet gehen möchte, benötige ich hier einen bestimmten ...