PowerShell 및-포함 연산자


143

다음 스 니펫을 고려하십시오.

"12-18" -Contains "-"

이것이로 평가 true된다고 생각 하지만 그렇지 않습니다. false대신 평가 됩니다. 왜 이런 일이 발생하는지 잘 모르겠지만 그렇게됩니다.

이를 피하기 위해 대신 사용할 수 있습니다.

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

이제식이 true로 평가됩니다.

첫 번째 코드 스 니펫이 왜 그렇게 동작합니까? -잘 어울리지 않는 특별한 점이 -Contains있습니까? 문서는 그것에 대해 아무것도 언급하지 않습니다.

답변:


196

-Contains연산자는 비교를 하위 문자열하지 않고 경기는 완전한 문자열에 있어야하며 컬렉션을 검색하는 데 사용됩니다.

연결 한 설명서에서 :

-설명 포함 : 격리 연산자. 참조 값 모음에 단일 테스트 값이 포함되어 있는지 여부를 알려줍니다.

이 예에서는 문자열 항목이 하나만 포함 된 컬렉션으로 작업하고 있다고 설명했습니다.

링크 한 문서를 읽으면이 동작을 보여주는 예가 표시됩니다.

예 :

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

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

나는 당신이 원하는 것이 -Match연산자 라고 생각합니다 .

"12-18" -Match "-"

어느 것이 반환합니다 True.

중요 사항 : 주석 및 링크 된 문서 에서 지적했듯이 -Match연산자는 정규식 을 사용하여 텍스트 일치를 수행합니다.


14
완전성을 위해 -Match는 정규식을 사용하는 것이 좋습니다. 모호하지 않은 문자열을 포함하려면 OP가 설명하는대로 확인해야합니다."12-18".Contains("-")
8DH

4
@ 8DH-아주 좋은 캐치 :). 질문을 다시 읽은 후에 Containspowershell 연산자와 .Contains() .NET String 메서드 의 차이점을 분명히해야한다고 생각합니다 .
Kev

1
위의 주석에서 이미 언급했듯이 -Match정규 표현식을 사용합니다. 이는 문자열 매개 변수가 정규 문자열이 아니라 정규식임을 의미합니다. 예를 들어 '.'인 정규 표현식 "hello" -Match "."이므로 true를 반환합니다 ".". 모든 문자와 일치합니다. 문자열에 전체 정지가 포함되어 있는지 확인하려면 : "hello" -Match "\."(거짓을 반환합니다)
malla

1
@malla-좋은 지적, 이것에 대한 메모에서 편집했습니다. 감사.
Kev

이것은 확실히 "가짜 친구"입니다! :) "-포함"의 존재는 "목록에 속함"을 의미합니다.
라울 살리나스 - Monteagudo

38

-Contains실제로 수집 연산자입니다. 컬렉션에 개체가 포함되어 있으면 true입니다. 문자열에만 국한되지 않습니다.

-match-imatch 캡처에 사용할 정규 표현식 문자열 정합 기, 및 세트 자동 변수입니다.

-like, -ilike정합 기 SQL-같다.


13

당신은 사용할 수 있습니다 like:

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

또는 split를위한 contains:

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.