Regex PowerShell将带括号的变量传递给正则表达式

Regex PowerShell将带括号的变量传递给正则表达式,regex,powershell,Regex,Powershell,我被一个正则表达式问题缠住了。我有一个文本文件,它有很多应用程序名,在开头和结尾都有不同的随机字符。有些应用程序用括号表示它的位版本(x64)和(x86)。我检查每个应用程序,取其名称并将其传递给我的函数。从那里,我将它与另一个文本文件进行比较,看看它在安装时是否有“OK”。但是,我的函数使用正则表达式,当我传递应用程序名称进行比较时,它就失败了,因为括号是正则表达式字符。这是我的功能 function Get_End($Application) { $EndRegex = [regex

我被一个正则表达式问题缠住了。我有一个文本文件,它有很多应用程序名,在开头和结尾都有不同的随机字符。有些应用程序用括号表示它的位版本(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)
我尝试在函数中使用{}而不是()将$放在前面,但没有成功

有人知道怎么避开这个吗


提前谢谢

如果您担心正则表达式控制字符被传递到您的函数,请让您的函数承担最坏的后果

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

这将自动在
$application
中找到的所有控制字符前面添加转义字符
$EndRegex
未用作
[regex]
对象,因此强制转换在此处是多余的。把它当作一根绳子放在这里就行了

如果您担心正则表达式控制字符被传递到您的函数,请让您的函数承担最坏的后果

$EndRegex = "($([regex]::Escape($Application))).*(END OK)"
$EndRegex = [regex]"($Application).*(END OK)"
这将自动在
$application
中找到的所有控制字符前面添加转义字符
$EndRegex
未用作
[regex]
对象,因此强制转换在此处是多余的。把它当作一根绳子放在这里就行了

$EndRegex = [regex]"($Application).*(END OK)"
这个字符串中有很多控制字符。想必,
*
是您实际尝试使用的唯一正则表达式模式?在这种情况下,您需要转义
$Application
中的所有控制字符以及字符串中的括号。正则表达式字符串的转义字符是反斜杠

我会这样做:

$EndRegex = [regex]("\({0}\).*\(END OK\)" -f [RegEx]::Escape($Application))
这个字符串中有很多控制字符。想必,
*
是您实际尝试使用的唯一正则表达式模式?在这种情况下,您需要转义
$Application
中的所有控制字符以及字符串中的括号。正则表达式字符串的转义字符是反斜杠

我会这样做:

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

这样调用函数时要小心。正确的语法只是
Get\u End$ApplicationName
。您的语法会起作用,但请记住括号是一个分组运算符,虽然成员函数像C#一样使用它们,但用户定义的函数不会!如果您创建了一个2参数函数,那么您会发现
MyFunction($Arg1,$Arg2)
将失败,因为PowerShell将尝试将$Arg1和$Arg2传递给第一个参数,而不会将任何内容传递给第二个参数。感谢您@BaconBits的回复。你完全正确。我一直在C#和powershell之间切换,而你让我意识到我是在用C#来称呼它。谢谢你这么做。小心那样调用你的函数。正确的语法只是
Get\u End$ApplicationName
。您的语法会起作用,但请记住括号是一个分组运算符,虽然成员函数像C#一样使用它们,但用户定义的函数不会!如果您创建了一个2参数函数,那么您会发现
MyFunction($Arg1,$Arg2)
将失败,因为PowerShell将尝试将$Arg1和$Arg2传递给第一个参数,而不会将任何内容传递给第二个参数。感谢您@BaconBits的回复。你完全正确。我一直在C#和powershell之间切换,而你让我意识到我是在用C#来称呼它。谢谢你。谢谢@BaconBits。这是可行的,但我认为马特的要简单得多。再次感谢您的快速回复。谢谢@BaconBits。这是可行的,但我认为马特的要简单得多。再次感谢您的快速回复。