PowerShell và toán tử -contains


143

Hãy xem xét đoạn trích sau:

"12-18" -Contains "-"

Bạn sẽ nghĩ rằng điều này đánh giá true, nhưng nó không. Điều này sẽ đánh giá để falsethay thế. Tôi không chắc tại sao điều này xảy ra, nhưng nó.

Để tránh điều này, bạn có thể sử dụng điều này thay thế:

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

Bây giờ biểu thức sẽ đánh giá là đúng.

Tại sao đoạn mã đầu tiên hành xử như vậy? Có điều gì đặc biệt về -việc không chơi độc đáo -Containskhông? Các tài liệu không đề cập bất cứ điều gì về nó.

Câu trả lời:


196

Các -Containsnhà điều hành không làm substring so sánh và trận đấu phải nằm trên một chuỗi đầy đủ và được sử dụng để các bộ sưu tập tìm kiếm.

Từ tài liệu bạn liên kết đến:

-Nội dung Mô tả: Toán tử chứa. Cho biết liệu một tập hợp các giá trị tham chiếu có bao gồm một giá trị thử nghiệm hay không.

Trong ví dụ bạn cung cấp, bạn đang làm việc với một bộ sưu tập chỉ chứa một mục chuỗi.

Nếu bạn đọc tài liệu bạn liên kết đến, bạn sẽ thấy một ví dụ minh họa hành vi này:

Ví dụ:

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

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

Tôi nghĩ những gì bạn muốn là -Matchnhà điều hành:

"12-18" -Match "-"

Mà trả về True.

Quan trọng: Như đã chỉ ra trong các bình luận và trong tài liệu được liên kết , cần lưu ý rằng -Matchtoán tử sử dụng các biểu thức chính quy để thực hiện khớp văn bản.


14
Để hoàn thiện, trong khi -Match có thể là một kết hợp tốt, nó sử dụng regex. Nếu ai đó muốn một chuỗi rõ ràng chứa kiểm tra thì nên thực hiện như OP mô tả:"12-18".Contains("-")
8DH

4
@ 8DH - Bắt rất tốt :). Đọc lại câu hỏi tôi nghĩ rằng tôi cần phải làm rõ sự khác biệt giữa Containstoán tử powershell và phương thức .Contains() .NET String .
Kev

1
Như đã đề cập trong bình luận ở trên, -Matchsử dụng regex. Điều đó có nghĩa là tham số chuỗi là regex chứ không phải chuỗi bình thường. Ví dụ: "hello" -Match "."sẽ trả về true, vì "."là biểu thức chính quy trong đó '.' sẽ phù hợp với bất kỳ nhân vật. Để kiểm tra xem một chuỗi có chứa toàn bộ dừng hay không: "hello" -Match "\."(trả về false)
malla

1
@malla - điểm tốt, tôi đã chỉnh sửa trong một ghi chú về điều này. Cảm ơn.
Kev

Đây chắc chắn là một "người bạn giả"! :) Sự tồn tại của "-contains" có nghĩa là "thuộc về một danh sách".
Raúl Salinas-Monteagudo

38

-Containsthực sự là một toán tử bộ sưu tập. Đó là sự thật nếu bộ sưu tập có chứa đối tượng. Nó không giới hạn trong chuỗi.

-match-imatch là các trình so khớp chuỗi biểu thức chính quy và đặt các biến tự động để sử dụng với các ảnh chụp.

-like, -ilikelà các đối sánh giống như SQL.


13

Bạn có thể sử dụng like:

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

Hoặc splitcho contains:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.