在我的主工作站上开发了这个语句,它正确地输出了一个分隔的文本文件:
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
答案 0 :(得分:2)
-match
是两个参数的运算符(一个位于-match
之后的一个参数之前)。
但是在每个管道段的开头,你需要一个命令(包括cmdlet) 1 。
有两种方法:
将-match
包装到像foreach-object
(或其%
别名)这样的cmdlet中:
... | %{ $_ -match $regex } | ...
记住-match
返回一个布尔值,而不是匹配的文本。
使用Select-String
这是一个明确包含的cmdlet,用于搜索文本。这确实返回匹配的文本(以及其他一些信息),并且可以自己读取文件:
Select-String -Path $inputFile $regex
1 严格来说:除了第一个,它可以是任何表达。
答案 1 :(得分:1)
错误的原因是match
是comparison 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)
get-Help Set-PSDebug
您只需添加以下内容:
type output.tmp | ? { $_ -match /r /v "^-[-|]*-.$" } > output.csv
或者更多的powershell-y方式:
Get-Content -Path:"Output.Tmp" | Where { $_ -match "^-[-|]*-.$" } | Out-File -FilePath:"output.csv"