2014-05-06 57 views
0

我是PowerShell的新手。我創建了一個可以由同事運行的exe文件,該文件將轉到8個單獨的sql服務器,並轉到單個目錄並檢查它們以獲取創建文件的列表。我目前的代碼檢查年齡不到一天,並且它不是空的,但是,我遇到了一個新問題。我需要能夠在文本文件/ array/csv/etc中獲取列表,並將列表與目錄進行比較,以確保文件夾中沒有任何其他文件。然後將所有信息格式化,導出到文件,然後通過電子郵件發送給某些收件人。Powershell,目錄驗證

我的問題是,我該如何創建一個使用這個想法的腳本;最好不用相當大的變化,以我目前的代碼,因爲它是相當長考慮到8個SQL服務器的子目錄。(節錄當前腳本如下):

$today = get-date 
$yesterday = $today.AddDays(-1) 
$file_array = "XXX_backup*.trn", "XXX_backup*.bak", "XXY_backup*.trn", "XXY_backup*.bak" 

$server_loc = \\hostname\e$\ 

$server_files = @(get-childitem $server_loc | where-object {$_.fullname -notmatch "(subdirectory)}) 

$server_complete_array = @("Files Directory ($server_loc)", " ") 

foreach ($file in $files) { 
    IF ($file.length -eq 0) { 
     [string]$string = $file 
     $server_complete_Array = $server_complete_Array + "$string is empty." 
     } 
elseif ($file.LastWriteTime -lt $yesterday) { 
     [string]$string = $file 
     $server_complete_Array = $server_complete_Array + "$string is old." 
     } 
else { 
     [string]$string = $file 
     $server_complete_Array = $server_complete_Array + "$string is okay."} 
} 

感謝您對您的幫助提前。 :)

回答

0

一個黑客位,但它應該與你已經有工作:既然你已經在你的文件規範中使用通配符

$file_array = "XXX_backup*.trn", "XXX_backup*.bak", "XXY_backup*.trn", "XXY_backup*.bak" 

$FileNames = $server_files | select -ExpandProperty Name 
$FileCheck = ('$Filenames ' + ($file_array | foreach {"-notlike '$_'"}) -join ' ') 

,這部作品與通過創建過濾器命令文件名稱數組通過一系列不相似的運算符,每個文件規範一個。

$FileCheck 

$Filenames -notlike 'XXX_backup*.trn' -notlike 'XXX_backup*.bak' -notlike 'XXY_backup*.trn' -notlike 'XXY_backup*.bak' 

每一個將篩選出符合文件規範的名稱,其餘傳遞到下一個-notlike操作。無論結果如何都沒有匹配

此時$ FileCheck只是一個字符串,您需要使用Invoke-Expression來運行它。

$ExtraFiles = Invoke-Expression $FileCheck 

,然後$ ExtraFiles應該包含所有不匹配在$ file_array任何文件規範的文件的名稱。由於過濾器是從$ file_array創建的,因此如果您從數組中添加或刪除文件規格,則不需要執行其他維護。

+0

謝謝你的幫助。我從來沒有想過要使用 - 不喜歡。我試圖使用IF($ server_files -ne $ file_array中的$文件),但它不能用於我能找到的任何變化。 – user3609991