2017-05-04 32 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