在管道输出上没有调用Powershell RegEx

时间:2013-11-06 11:16:31

标签: regex powershell

在我的主工作站上开发了这个语句,它正确地输出了一个分隔的文本文件:

type output.tmp | -match /r /v "^-[-|]*-.$"  >  output.csv

现在,在我的笔记本电脑(同样的win8.1)上工作,据说所有相同的PS模块和管理单元都被加载,它会抛出一个错误:

-match : The term '-match' is not recognized as the name of a cmdlet, 

然而:

"Software" –match "soft"

作品。

1)为什么?

2)我是否应该调用PS命令行开关才能获得更详细/更有用的错误输出?

THX

3 个答案:

答案 0 :(得分:2)

-match是两个参数的运算符(一个位于-match之后的一个参数之前)。

但是在每个管道段的开头,你需要一个命令(包括cmdlet) 1

有两种方法:

  1. -match包装到像foreach-object(或其%别名)这样的cmdlet中:

    ... | %{ $_ -match $regex } | ...
    

    记住-match返回一个布尔值,而不是匹配的文本。

  2. 使用Select-String这是一个明确包含的cmdlet,用于搜索文本。这确实返回匹配的文本(以及其他一些信息),并且可以自己读取文件:

    Select-String -Path $inputFile $regex
    

  3. 1 严格来说:除了第一个,它可以是任何表达。

答案 1 :(得分:1)

错误的原因是matchcomparison operator,而不是cmdlet:

  

比较运算符允许您指定比较值的条件   并找到与指定模式匹配的值。 使用比较   运算符,指定要与a一起比较的值   分隔这些值的运算符

此外:

  

匹配运算符(-Match和-NotMatch)使用正则表达式查找与指定模式匹配或不匹配的元素。

     

语法为:

<string[]> -Match <regular-expression>
<string[]> -NotMatch <regular-expression>
     

以下示例显示了-Match运算符的一些用法:

PS C:\> "Windows", "PowerShell" -Match ".shell"
PowerShell

PS C:\> (Get-Command Get-Member -Syntax) -Match "-view"
True

PS C:\> (Get-Command Get-Member -Syntax) -NotMatch "-path"
True

PS C:\> (Get-Content Servers.txt) -Match "^Server\d\d"
Server01
Server02
     

匹配运算符仅搜索字符串。 他们无法搜索整数数组或其他对象。

所以,正确的语法是:

@(type output.tmp) -match "^-[-|]*-.$" > output.csv

注意:正如@mjolinor建议的那样,@前缀会强制(type output.tmp)进入数组,以防输入文件只包含一行。

答案 2 :(得分:0)

  1. 要获得令人讨厌的调试输出量get-Help Set-PSDebug
  2. 您只需添加以下内容:

    type output.tmp | ? { $_ -match /r /v "^-[-|]*-.$" } > output.csv

  3. 或者更多的powershell-y方式:

    Get-Content -Path:"Output.Tmp" | Where { $_ -match "^-[-|]*-.$" } | Out-File -FilePath:"output.csv"