Regex 从脚本运行时Powershell开关正则表达式失败,但在控制台中成功
这是在Powershell-noprofile中的Windows XP SP3上的Powershell v2中运行的 如果我复制并粘贴到控制台中,下面的Powershell脚本可以工作,但如果我将其作为脚本运行,则无法工作。有人知道是什么原因造成的吗 脚本如下(一些名称已被更改以保护无辜者) 当我将其作为脚本运行时(例如,如果保存到c:\temp\ErrorReporting.ps1并使用Regex 从脚本运行时Powershell开关正则表达式失败,但在控制台中成功,regex,powershell,switch-statement,powershell-2.0,Regex,Powershell,Switch Statement,Powershell 2.0,这是在Powershell-noprofile中的Windows XP SP3上的Powershell v2中运行的 如果我复制并粘贴到控制台中,下面的Powershell脚本可以工作,但如果我将其作为脚本运行,则无法工作。有人知道是什么原因造成的吗 脚本如下(一些名称已被更改以保护无辜者) 当我将其作为脚本运行时(例如,如果保存到c:\temp\ErrorReporting.ps1并使用 &c:\Temp\ErrorReporting.ps1 匹配部分失败: {“$($e.line)”-mat
&c:\Temp\ErrorReporting.ps1
匹配部分失败:
{“$($e.line)”-match“^.*.*.
$”}该问题是由于字符串拆分操作在脚本和控制台中的工作方式不同。粘贴到控制台可能会产生保存的脚本文件包含的不同行尾(\r\n
而不仅仅是\n
)。因此,显式指定$knownErrorText
数组将有助于生成它,而不是拆分字符串
$knownErrorText = 'Invalid Descriptor Index',
'Syntax error or access violation',
...
旁白:
您没有按预期使用开关-Regex
。标准用法不是让scriptblock执行-match
比较来定义案例,而是简单地提供输入匹配的Regex字符串。例如
$myStr = 'abc123'
switch -regex ($myStr)
{
'abc\d\d\d' { 'abc with 3 numbers'; break }
'xyz\d\d\d' { 'xyz with 3 numbers'; break }
}
如果您在scriptblocks内部进行检查以定义案例,那么实际上根本不需要-regex
标志
您的目标似乎是检查$e.Line
是否包含任何已知的错误消息。如果是这样,那么无论如何,开关可能不是最好的工具。您可以像下面这样简单地执行此操作:
foreach ($e in $scerrors)
{
if( $knownErrors |?{$e.Line -match $_} )
{
"$($e.Line) matches a known error"
}
else
{
"$($e.Line) does not match a known error"
}
}
此构造的结果与交换机构造的结果相同。如果粘贴到控制台窗口中,它可以正常工作,但在作为脚本运行时无法计算匹配。可能是字符串拆分失败-粘贴到控制台可能会导致与脚本文件不同的行尾。为什么要执行
拆分
如果测试条件不是字符串(在本例中是表达式),则忽略-regex开关。这肯定与该数组有关。如果我使用$knownErrorText=@('Error1','Error2')
然后匹配工作。它实际上只是我开发的一个工件-真正的脚本将从文本文件中读取,因此不会遇到这种情况。Doh!对我来说仍然很奇怪,它在控制台中工作,但不是作为脚本。我不认为它下面的答案是正确的。拉特金,如果你用字符串split c做一个新的答案注意,我会将其标记为答案。我只会将该信息附加到我当前的答案中。顺便说一句,在这种情况下,您不需要将数组包装在@()
中,尽管如果您愿意,也没有什么害处。
foreach ($e in $scerrors)
{
if( $knownErrors |?{$e.Line -match $_} )
{
"$($e.Line) matches a known error"
}
else
{
"$($e.Line) does not match a known error"
}
}