2014-09-26 115 views
1

我需要修改此腳本,我一直在努力發送電子郵件警報,如果我們發現的目錄名稱中包含「1970」。我正在嘗試使用-Like操作符來完成此操作,但無法正常工作。我不知道這個問題是否是我對操作員的使用,或者是支票的放置,或者是其他的問題。使用-Like運算符

一些注意事項:我編輯了電子郵件和我的SMTP服務器,但我可以確認這一行代碼確實可以自行工作。

這裏是我試過:

$limit = (Get-Date).AddDays(0) 
$logFile = "C:\STest\Log\log.txt" 

#Throw a timestamp on the log file 
Add-Content -Path $logFile "=======$(Get-Date)=======" 

#Get all of the paths for each camera 
$paths = Get-ChildItem -Path "C:\Videos\" |Select-Object -ExpandProperty FullName 

#for each path we found 
foreach ($pa in $paths) { 
    # Delete directories older than the $limit. 
    $file = Get-ChildItem -Path $pa -Recurse -Force | Where-Object { $_.PSIsContainer -and $_.CreationTime -lt $limit } 
    $file | Remove-Item -Recurse -Force 
    $file | Select -Expand FullName | Out-File $logFile -append 
    if ($file.FullName -like '1970'){ 
     Send-MailMessage -to "Joe <[email protected]>" -from "Tod <[email protected]>" -subject "1970 Found" -body "Testing" -SmtpServer mySMTPserver 
    } 
} 

我也試過:

if($file -like "1970"){ } 

if ($file.FullName -like "1970"){ } 

if ($file.FullName -like 1970) { } 
+1

嘗試用'-match'代替'-like'(後者需要野汽車) – 2014-09-26 14:06:07

回答

5

-like更換樣是通配符運算符。要在匹配字符串「1970」的任何地方,你需要在兩端添加通配符*字符:

PS C:\> 'something 1970 somethingelse' -like '*1970*' 
True 

如果你想在字符串的開頭匹配「1970年」,省略了領先*
要匹配字符串末尾的'1970',請忽略尾部*

使用通配符?字符來匹配任何單個字符,並使用'globbing'通配符語法來匹配一系列字符。

參見:

Get-Help about_Wildcards

有關使用通配符匹配的更多信息。

從性能角度來看,直接的比較(-eq-ne-lt-gt)是最快,其次是通配符匹配(-like-notlike)。正則表達式匹配(-match-notmatch)提供了最大的靈活性,但也是最慢的。

+0

@Ansgar:感謝編輯(我搞砸了領先/尾隨)。削減性能考慮的任何特定原因? – mjolinor 2014-09-26 14:28:29

+0

奇怪的是,我不記得在編輯答案時刪除了(或者甚至注意到)該段落。恢復。 – 2014-09-26 15:39:01

1

嘗試使用與-match

if($file -match "1970"){ DO SOMETHING } 
+0

非常好用。但它似乎只發送一次電子郵件,即使有多個名稱中帶有「1970」的目錄。 – 2014-09-26 14:11:14

+0

您可能從Get-ChildItem獲取文件的集合,您需要循環並執行匹配。 – mhatch73 2014-09-26 14:15:46