2014-10-17 2 views
0

powershell의 조건문에 -match 기능과 관련된 문제가 있습니다.Powershell - 일치 및 이상한 결과

Test.dll에 (이 DLL이있는 [TestClass] 단어가 있습니다)

Test1 파일 :

내가 3 개 파일을 말해봐. dll (이 DLL에는 괄호가없는 TestClass이 있습니다)

Test2. dll을 내가 가지고있는 파일을 검색하고

(이 DLL이 전혀없는)에만 [TestClass]

내가 다음 코드를 사용하는 경우 Test.dll에이 상태에서 Test1.dll 작업 모두 :

if ([IO.File]::ReadAllText($_) -match "TestClass") 
    { 
    $ProjectTestContainers += $_ 
    Write-Host $ProjectTestContainers 
    } 

이해야한다 (그런데, 각 $_는 DLL입니다),하지만 그건 내가 원하는 게 아니에요. 난 단지 [TestClass]를 포함하는 파일 그래서 나는이 모든 조건, Test.dll에, Test1.dll 및 Test2.dll, 작동되는 말아야이

if ([IO.File]::ReadAllText($_) -match "`[TestClass`]") 
{ 
    $ProjectTestContainers += $_ 
    Write-Host $ProjectTestContainers 
} 

을 시도합니다. 그것은 단지 나를 포함해야합니다 Test.dll을 제공해야합니다.

아이디어가 있으십니까? 나 한테 더 필요한 것이 있으면 알려줘.

+0

이 아닌가'dll's 컴파일? 파일이 바이너리 인 경우 문자열을 어떻게 일치시킬 것입니까? – arco444

+0

많은 코드가 미리 작성되었지만 어떻게 든 DLL을 검색합니다. 그것은 첫 번째 예제에서 'TestClass'를 찾고 있기 때문에 작동합니다. 그러나 그것은 단지 '[TestClass]'가 아니라 'TestClass'를 사용하고 있습니다. 나는 어떻게 든 그것이 dll에서 텍스트를 읽을 수 있다고 가정하고있다. –

+0

내가 생각했던 것보다 더 큰 수정이라고 생각합니다. 원래이 파일을 작성한 사람은 dll에서 읽는 것입니다. dll은 처음에는 이상한 파일입니다. 그것은 어쨌든 어떤 경우에는 성냥을 찾는 것입니다. 그것은 이상합니다. 그것이 dll과 같이 작동해서는 안되기 때문에 우연히 될지도 모릅니다. 이것은 순수한 추악함입니다. 그래서 arco444, 당신 말이 맞을지도 모릅니다. 이 코드를 다시 작성해야 할 것입니다. –

답변

2

-match 연산자는 'TestClass'문자열과 비교하여 정규 표현식 비교를 수행하므로 정규 표현식 패턴의 올바른 이스케이프 문자가 올바르지 않습니다. 괄호 문자는 정규 표현식 패턴의 특수 문자이므로 이스케이프해야한다고 생각하는 것이 옳습니다. 우리가 정규식을 다루기 때문에 올바른 이스케이프 문자는 '\'입니다. 이 대신하려고 :

는 는
if ([IO.File]::ReadAllText($_) -match "\[TestClass\]") 
+0

나는 이것을 시도해 보았지만 작동하지 않는다고 생각한다. 하지만 다시 시도하겠습니다. –

+0

예. 이 곳에서는'[TestClass]'를 찾을 수 없습니다. 그것은 Test.dll에서 찾아야합니다. 조건을 사용하면 완전히 건너 뜁니다. –

+0

알려줄 내용을 모르겠다 : PS C : \ Windows \ system32> '[TestClass]'- 일치 "\\ [TestClass \\]" True – jbsmith

2

또한이 일반적인 variant..more 사용할 수 있습니다

$m = '[TestClass]' 
if ([IO.File]::ReadAllText($_) -match [regex]::escape($m)) 
+0

Ah; 좋은 지적. [regex] :: esape를 사용하면 닫는 대괄호를 이스케이프 할 필요가 없음을 알 수 있습니다. 그래서 "\\ [TestClass]"해야합니다. – jbsmith

+0

이것이 작동하지 않았습니다. 나는 그것이 내가 생각했던 것보다 더 큰 수정일지도 모른다라고 생각한다. 원래이 파일을 작성한 사람은 dll에서 읽는 것입니다. dll은 처음에는 이상한 파일입니다. 그것은 어쨌든 어떤 경우에는 성냥을 찾는 것입니다. 그것은 이상합니다. 그것이 dll과 같이 작동해서는 안되기 때문에 우연히 될지도 모릅니다. 이것은 순수한 추악함입니다. –

+1

.dll 확장에 대해 궁금합니다. 아마도 Sysinternals의 strings.exe가 여기에서 도움이 될까요? http://technet.microsoft.com/en-us/sysinternals/bb897439.aspx – jbsmith