Regex 从脚本运行时Powershell开关正则表达式失败,但在控制台中成功

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

这是在Powershell-noprofile中的Windows XP SP3上的Powershell v2中运行的

如果我复制并粘贴到控制台中,下面的Powershell脚本可以工作,但如果我将其作为脚本运行,则无法工作。有人知道是什么原因造成的吗

脚本如下(一些名称已被更改以保护无辜者)

当我将其作为脚本运行时(例如,如果保存到c:\temp\ErrorReporting.ps1并使用
&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"
   }
}