0

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

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 命令行开关以获得更详细/有用的错误输出吗?

谢谢

4

3 回答 3

2

-match是两个参数的运算符(一个放在一个之前,一个放在 之后-match)。

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

有两种方法:

  1. 将其包装-match成一个类似foreach-object(或其%别名)的 cmdlet:

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

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

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

    Select-String -Path $inputFile $regex
    

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

于 2013-11-06T11:44:21.490 回答
1

错误的原因match比较运算符,而不是 cmdlet:

比较运算符让您可以指定比较值和查找与指定模式匹配的值的条件。要使用比较运算符,请指定要与 分隔这些值的运算符一起比较的值

还:

匹配运算符(-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)放入数组中,以防输入文件仅包含一行。

于 2013-11-06T11:44:18.477 回答
0
  1. 为了获得大量的调试输出,get-Help Set-PSDebug
  2. 您只需添加以下内容:

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

或者更强大的方式:

Get-Content -Path:"Output.Tmp" | Where { $_ -match "^-[-|]*-.$" } | Out-File -FilePath:"output.csv"
于 2013-11-06T19:11:54.363 回答