erikro
Goto Top

Methode contains() vs. -contains

Moin,

zum Hintergrund: Ich habe ein PS-Skript geschrieben, in dem anhand einer Textdatei entschieden wird, ob für den jeweiligen User eine Funktion ausgeführt wird. Das Originalskript lautete so:

...
# Quatsch! get-content = $userlist

$userlist = get-content ...

if ($userlist.contains($env:username)) {

#mappe das Laufwerk

} 
...

Ich habe das getestet und es lief. Ich habe keine Ahnung, warum ich das so gemacht habe und nicht wie sonst mit

...
# Quatsch! get-content = $userlist

$userlist = get-content ...
if ($userlist -contains $env:username) {

#mappe das Laufwerk

} 
...

Dann lief es bei einem User nicht. Am Ende stellte sich dann heraus, dass beim username ein Buchstabe war, der da nicht hingehörte. Aber das kennt wahrscheinlich jeder. Man vergleicht es zehnmal und ist der festen Überzeugung, dass nichts ungleich sein darf, was gleich sein muss. Erst beim elften Mal sieht man dann den Dreher oder das Zeichen zuviel. face-wink Aber das nur nebenbei. Jedenfalls habe ich es dann bei der Fehlersuche auf meine übliche Methode geändert und das Skript macht natürlich immer noch das, was es soll. Da stellt sich mir die Frage, ob es einen Unterschied gibt, ob man die Methode oder den Vergleichsoperator nimmt. Oder ist das egal? Ich frage deshalb, weil es ja an anderen Stellen bei zwei verschiedenen Lösungsmöglichkeiten Unterschiede gibt (z. B. foreach(...) oder ...| foreach-object) was Performance und Speicherbedarf betrifft.

Eine Anmerkung: Ja, das ist ein Arbeitsgruppennetzwerk (brrrrrr). Deshalb muss ich ja solche Krücken bauen. Deshalb hat man solche Fehler wie einen abweichenden Username auf einem Rechner. Und nein, ich brauche keine Ratschläge zur Verbesserung. Ich habe da noch acht Arbeitstage. Die Ratschläge habe ich schon alle selbst erteilt. Tja, jetzt gehe ich. face-wink

Liebe Grüße

Erik

Content-Key: 1517106953

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

Printed on: April 25, 2024 at 12:04 o'clock

Mitglied: 149569
Solution 149569 Nov 16, 2021 updated at 21:18:31 (UTC)
Goto Top
Aufpassen sollte man auf jeden Fall wenn man Contains auf Variablen anwendet das man hier auch tatsächlich ein Array vorliegen hat

# be carefull when using contains
# when it's a single string, contains matches substrings   
"Hallo Max".contains("Max")  

#... where as array it does not
("Hallo Max","Andreas").Contains("Max")  

# The -contains operator instead always needs a full match of an array entry to return true
"Hallo Max","Andreas" -contains "Max"  

Das .Contains an einer Array Variablen angehängt ist das selbe als wenn man den -contains Operator benutzt. Beide nutzen die Methode aus dem Namenspace System.Linq
Enumerable.Contains Methode
Member: erikro
erikro Nov 16, 2021 at 21:25:18 (UTC)
Goto Top
Moin,

Zitat von @149569:
Aufpassen sollte man auf jeden Fall wenn man Contains auf Variablen anwendet das man hier auch tatsächlich ein Array vorliegen hat

Das ist klar. face-wink

Das .Contains an einer Array Variablen angehängt ist das selbe als wenn man den -contains Operator benutzt. Beide nutzen die Methode aus dem Namenspace System.Linq

Also kein Unterschied. Die Methode finde ich schicker. face-wink Danke.

Liebe Grüße

Erik
Mitglied: 149569
149569 Nov 16, 2021 updated at 21:39:08 (UTC)
Goto Top
Zitat von @erikro:

Das ist klar. face-wink

Offensichtlich nicht, denn wenn bei deinem geposteten Beispiel oben nur eine Zeile in der Textdatei steht geht dein Beispiel in die Hose weil kein Array mehr
https://tio.run/##K8gvTy0qzkjNyfn/X90jMScnX8E3sUJdoUYhv7RENy0zJ1WhJLW4RK ...
da musst du dann schon [String[]] oder [Array] vor die Variable schreiben damit du sauber bleibst :-P ....
https://tio.run/##K8gvTy0qzkjNyfn/X90jMScnX8E3sUJdoUYhv7RENy0zJ1WhJLW4RK ...

Und sowas hier geht ja gar nicht

get-content = $userlist

Get-content CMDLet eine Variable zuweisen ?? Tippfehler?
Member: erikro
erikro Nov 16, 2021 at 21:38:34 (UTC)
Goto Top
Moin,

Zitat von @149569:

Zitat von @erikro:

Das ist klar. face-wink

Offensichtlich nicht, denn wenn bei deinem geposteten Beispiel oben nur eine Zeile in der Textdatei steht geht dein Beispiel in die Hose weil kein Array mehr

Nö, nicht wirklich. face-wink Wenn nur ein Username drinsteht, dann matched es ja auch richtig. Und es hat den Vorteil, sollte mal ein Dämlack das Readme nicht richtig lesen, er auch die User in eine Zeile schreiben kann. face-wink Aber Variablendeklaration ist sauberer. Wird angepasst.

get-content = $userlist

Get-content CMDLet eine Variable zuweisen ???

Oooooops. Das gehört anders herum. face-wink Es ist schon spät. face-wink

Liebe Grüße

Erik
Mitglied: 149569
149569 Nov 16, 2021 updated at 21:41:52 (UTC)
Goto Top
Nö, nicht wirklich. face-wink face-wink Wenn nur ein Username drinsteht, dann matched es ja auch richtig
Nee, wenn es einen Max und einen Maximilian im Unternehmen gibt dann würde das bei "Max" auch matchen obwohl da eben "Maximilian" im File steht 🤪
Member: erikro
erikro Nov 16, 2021 at 21:42:21 (UTC)
Goto Top
Zitat von @149569:

Nö, nicht wirklich. face-wink face-wink Wenn nur ein Username drinsteht, dann matched es ja auch richtig
Nee, wenn es einen Max und einen Maximilian im Unternehmen gibt dann macht das bei Max auch obwohl da Maximilian File steht 🤪

Ist ja gut. Ich hab ja schon gesagt, dass ich das anpasse. Vielleicht ist es sogar schon so. Ich kann jetzt nicht nachgucken. face-wink
Mitglied: 149569
149569 Nov 16, 2021 at 21:44:22 (UTC)
Goto Top
Na denn, schönen Feierabend wenn's denn soweit ist🖖