我遇到了正则表达式问题。我有一个文本文件,它有许多应用程序名称,在它的开头和结尾有不同的随机字符。某些应用程序有括号来显示它的位版本(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)
我尝试在我的函数中使用$前置使用{}而不是()而没有运气。
任何人都知道如何解决这个问题?
提前致谢!
答案 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))