2014-10-17 4 views
0

У меня возникла проблема с функцией -match в условном заявлении в PowerShell.Powershell -match и weird results

Скажем, у меня есть 3 файла:

test.dll (эта длл имеет [TestClass] слово в нем)

test1. dll (эта dll имеет TestClass без скобок)

Test2. длл (эта длл не имеет его вообще)

Я ищу для файлов, которые имеют только [TestClass]

Если я использую следующий код, как test.dll и Test1.dll работа в этом состоянии: (кстати, каждый $_ является длл)

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

, которые он должен, но это не то, что я хочу. Я хочу только файлы, которые содержат [TestClass] Так что я попробовал этот

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

Это работает для всех условий, test.dll, Test1.dll и Test2.dll, что он не должен. Он должен только дать мне Test.dll, потому что он единственный, который содержит [TestClass]

Любые идеи? Дайте мне знать, если вам нужно больше от меня.

+0

ли не 'dll's компилируется? Как вы собираетесь сопоставлять строку, если файл двоичный? – arco444

+0

много кода было предварительно написано, но как-то он ищет DLL. Это похоже на то, что в первом примере он находит TestClass. Но он тянет ЛЮБОЙ «TestClass», а не только «[TestClass]». Я действительно предполагаю, что каким-то образом он может читать текст в dll. –

+0

Я думаю, что это может быть большим решением, чем я думал. Человек, который изначально написал это, читает из dll, что странно для начала. Это как-то находит совпадения в некоторых случаях, хотя это странно. Может быть, случайность, потому что она не должна работать так, как с dll. Это чистое уродство. Так arco444, вы можете быть правы. Вероятно, мне придется переписать этот код. –

ответ

2

Оператор -match выполняет сравнение регулярных выражений с вашей строкой TestClass, поэтому символ обратного хода (`) не является правильным символом escape для шаблонов регулярных выражений. Вы правы, думая, что символы скобок должны быть экранированы, поскольку это специальные символы в шаблоне регулярных выражений. Поскольку мы имеем дело с регулярным выражением, правильным символом escape является «\»; попробуйте вместо этого:

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

Думаю, я тоже это пробовал, и это не сработало. Но позвольте мне попробовать еще раз. –

+0

Да. Этого не найдено '[TestClass]' где угодно. Он должен найти его в Test.dll. Условие полностью игнорируется при его использовании. –

+0

Не знаю, что вам сказать: PS C: \ Windows \ system32> '[TestClass]' -match "\\ [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. Это чистое уродство. –

+1

Мне было интересно, расширения .dll; может быть, strings.exe от Sysinternals поможет здесь? http://technet.microsoft.com/en-us/sysinternals/bb897439.aspx – jbsmith

Смежные вопросы