PowerShell将带括号的变量传递给Regex

时间:2017-08-22 12:25:37

标签: regex powershell

我遇到了正则表达式问题。我有一个文本文件,它有许多应用程序名称,在它的开头和结尾有不同的随机字符。某些应用程序有括号来显示它的位版本(x64)和(x86)。我通过每个应用程序,取名称并将其传递给我的功能。从那里我将它与另一个文本文件进行比较,看它是否有" OK"因为它已经安装好了。但是,我的函数使用正则表达式,当我传递我的应用程序名称进行比较时,它只是失败,因为括号是正则表达式字符。这是我的功能

function Get_End($Application)
{
    $EndRegex = [regex]"($Application).*(END OK)"
    try
    {
        $result = Get-Content "C:\temp\test.log" | Where-Object{ $_ -Match 
        $EndRegex }
        if($result -eq $null)
        {
           return "Not Found"
        }
        else
        {
            return $Matches[2]
        }
    }
    catch
    {
        Return "ERROR"
    }
} 

这就是我传递变量名的方式:

Get_End($ApplicationName)

我尝试在我的函数中使用$前置使用{}而不是()而没有运气。

任何人都知道如何解决这个问题?

提前致谢!

2 个答案:

答案 0 :(得分:2)

如果您担心将正则表达式控制字符传递给您的函数,则会使您的函数假设为最差。

$EndRegex = "($([regex]::Escape($Application))).*(END OK)"

这将自动在$application中找到的所有控制字符前面添加转义字符。 $EndRegex未被用作[regex]对象,因此强制转换在这里是多余的。将它保持为字符串在这里工作得很好。

答案 1 :(得分:1)

$EndRegex = [regex]"($Application).*(END OK)"

你在这个字符串中有很多控制字符。据推测,.*是您实际尝试使用的唯一正则表达式模式?在这种情况下,您需要转义$Application中的任何控制字符以及字符串中的括号。正则表达式字符串的转义字符是反斜杠。

我会这样做:

$EndRegex = [regex]("\({0}\).*\(END OK\)" -f [RegEx]::Escape($Application))