2014-10-17 94 views
0

我在PowerShell中的条件语句-match功能有问题。PowerShell - 匹配和奇怪的结果

说我有3个文件:

Test.dll的(这个dll有[TestClass]字在里面)

测试1。 dll(这个dll有TestClass没有括号)

Test2。 DLL(这个DLL没有它的话)

我正在寻找有文件只[TestClass]

如果我使用下面的代码,无论是Test.dll的,在这种情况Test1.dll工作: (顺便说一句,每个$_是一个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 2014-10-17 15:30:58

+0

很多代码都是预先写好的,但不知何故它正在搜索dll。它有点作用,因为它在第一个例子中找到了'TestClass'。但它正在拉动任何'TestClass',而不仅仅是'[TestClass]'。我真的假设它以某种方式可以读取dll中的文本。 – 2014-10-17 15:33:27

+0

我认为这可能比我想象的更大。原本写这个的人是从dll读取的,这很奇怪。尽管这在某些情况下找到了匹配,但这很奇怪。可能是一种侥幸,因为它不应该像dll那样工作。这是纯粹的丑陋。所以arco444,你可能是对的。我可能不得不重写这段代码。 – 2014-10-17 16:14:25

回答

2

-match运算符正在对'TestClass'字符串进行正则表达式比较,所以反斜杠(')字符不是正则表达式模式的正确转义字符。你认为括号字符需要被转义是正确的,因为那些是正则表达式模式中的特殊字符。因为我们正在处理正则表达式,正确的转义字符是'\';试试这个来代替:

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

我想我也尝试过这一点,它没有奏效。但让我再试一次。 – 2014-10-17 15:23:09

+0

是的。这个在任何地方都找不到'[TestClass]'。它应该在Test.dll中找到它。使用它时,条件完全被忽略。 – 2014-10-17 15:26:16

+0

不知道该告诉你什么: PS C:\ Windows \ system32>'[TestClass]'-match“\\ [TestClass \\]” True – jbsmith 2014-10-17 15:32:16

2

您也可以使用此variant..more通用:

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

啊;好点子。使用[regex] :: esape显示方括号不需要转义。所以“\\ [TestClass]”应该这样做。 – jbsmith 2014-10-17 15:58:53

+0

这没有奏效。我认为这可能比我想象的更大。原本写这个的人是从dll读取的,这很奇怪。尽管这在某些情况下找到了匹配,但这很奇怪。可能是一种侥幸,因为它不应该像dll那样工作。这是纯粹的丑陋。 – 2014-10-17 16:13:08

+1

我在想.dll扩展名;也许从Sysinternals的strings.exe会帮助这里? http://technet.microsoft.com/en-us/sysinternals/bb897439.aspx – jbsmith 2014-10-17 18:28:58