PowerShell e l'operatore -contains


143

Considera il seguente frammento:

"12-18" -Contains "-"

Penseresti che questo valuti true, ma non lo è. Questo valuterà falseinvece. Non sono sicuro del perché questo accada, ma lo fa.

Per evitarlo, puoi invece usarlo:

"12-18".Contains("-")

Ora l'espressione verrà valutata vera.

Perché il primo snippet di codice si comporta in questo modo? c'è qualcosa di speciale in -cui non si gioca bene -Contains? La documentazione non menziona nulla al riguardo.

Risposte:


197

L' -Containsoperatore non esegue confronti di sottostringa e la corrispondenza deve essere su una stringa completa e viene utilizzata per cercare raccolte.

Dalla documentazione collegata a:

-Contiene la descrizione: operatore di contenimento. Indica se una raccolta di valori di riferimento include un singolo valore di prova.

Nell'esempio che hai fornito, stai lavorando con una raccolta contenente solo un oggetto stringa.

Se leggi la documentazione che hai collegato vedrai un esempio che dimostra questo comportamento:

Esempi:

PS C:\> "abc", "def" -Contains "def"
True

PS C:\> "Windows", "PowerShell" -Contains "Shell"
False  #Not an exact match

Penso che ciò che vuoi sia l' -Matchoperatore:

"12-18" -Match "-"

Che ritorna True.

Importante: come sottolineato nei commenti e nella documentazione collegata , va notato che l' -Matchoperatore utilizza espressioni regolari per eseguire la corrispondenza del testo.


14
Per completezza, mentre -Match può essere una buona corrispondenza usa regex. Se si desidera che una stringa inequivocabile contenga un controllo, è necessario fare come descritto dall'OP:"12-18".Contains("-")
8DH,

4
@ 8DH - ottima cattura :). Dopo aver riletto la domanda, penso di dover chiarire la differenza tra l' Containsoperatore PowerShell e il metodo .Contains() .NET String .
Kev

1
Come già accennato nel commento sopra, -Matchusa regex. Ciò significa che il parametro string è una regex, non una stringa normale. Ad esempio, "hello" -Match "."restituirà true, poiché "."è una regex in cui un '.' corrisponderà a qualsiasi personaggio. Per verificare se una stringa contiene un punto: "hello" -Match "\."(restituisce false)
malla

1
@malla - buon punto, ho modificato in una nota a riguardo. Grazie.
Kev

Questo è certamente un "falso amico"! :) L'esistenza di "-contains" che significa "appartenenza a un elenco".
Raúl Salinas-Monteagudo,

38

-Containsè in realtà un operatore di raccolta. È vero se la raccolta contiene l'oggetto. Non è limitato alle stringhe.

-matche-imatch sono abbinatori di stringhe di espressioni regolari e impostano variabili automatiche da utilizzare con le acquisizioni.

-like, -ilikesono abbinatori simili a SQL.


13

Puoi usare like:

"12-18" -like "*-*"

O splitper contains:

"12-18" -split "" -contains "-"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.