2017-05-04 33 views
1

在搜索日志文件时遇到一些麻烦。我有一个基本脚本,用于在日志文件中搜索特定文本。问题是,我试图使用可以由用户在命令行调整的变量,但我无法让它们被识别。该脚本应该将结果输出回屏幕。命令行的使用变量在文件中搜索字符串

param (
[string]$file , 
[string]$Ip , 
[string]$port 
) 
Get-Content -Path C:\$file | Where-Object {$_ -like $Ip -and $_ -like $port} 

实施例来执行的脚本:

PS C:\> .\LogSearch.ps1 logfile04.txt 192.168.1.7 21

在这种情况下,logfile04.txt是文件,端口是21和IP地址为192.168.1.7

此时运行脚本,我没有任何返回,但文件中有这条线。

4|Oct 19 2015|18:28:39|106023|75.76.77.80|50077|192.168.1.7|21|Deny tcp src

+1

'-like'使用正则表达式。如果你输入'*'包围的IP和端口,它是否工作? –

+1

@MacroPower'-like'不使用'-match'的正则表达式。 [''''使用通配符](https://msdn.microsoft.com/powershell/reference/5.1/Microsoft.PowerShell.Core/about/about_Wildcards),其中'*'确实是一个。 – BenH

+0

在命令行中使用'*'确实有效!现在我用'192.168.1.7'取代所有的行,而不是只有那些端口为'21'的行。但我想这是与这个问题无关的另一个问题。 –

回答

1

没有通配符使用时,操作者-like-eq等效。由于您的线路不能同时完全等于192.168.1.721,因此它永远不会返回。所以如果你想使用-like你需要用通配符来包围你的匹配字符串。

Get-Content -Path C:\$file | Where-Object {$_ -like "*$Ip*" -and $_ -like "*$port*"} 

或者,-match运算符使用正则表达式。所以你不需要通配符。

Get-Content -Path C:\$file | Where-Object {$_ -match $Ip -and $_ -match $port} 

这里是一个good guide on the different uses of these comparison operators