2017-04-11 119 views
4

我們每天都會收到來自多個客戶端的zip文件。文件名由以下部分組成:檢測文件夾中缺少的文件名

data_clientname_timestamp.zip 

其中「數據」始終是相同的文字,「客戶端名」可以是任何東西,「時間戳」是文件的創建日期。

這些文件總是在同一個目錄中。客戶端名稱總是事先知道的,所以我知道應該接收哪些文件。

腳本應該做到以下幾點:

  • 列出收到的所有文件(創建)今天
  • 如果從一個或多個客戶機的文件丟失,寫「從客戶端文件..失蹤」到文件
  • 我想列出一個變量的客戶端,所以這些可以很容易地改變。

我到目前爲止有:

$folder='C:\data' 
Get-ChildItem $folder -recurse -include @("*.zip") | 
    Where-Object {($_.CreationTime -gt (Get-Date).Date)} | select name | out-file $folder\result.txt 

但如何檢查文件丟失的文件?

編輯: TESTDATA:

$Timestamp = (Get-Date).tostring(「yyyyMMddhhmmss」) 
New-Item c:\Data -type Directory 
New-Item c:\Data\Data_client1_$Timestamp.zip -type file 
New-Item c:\Data\Data_client2_$Timestamp.zip -type file 
New-Item c:\Data\Data_client3_$Timestamp.zip -type file 
New-Item c:\Data\Data_client5_$Timestamp.zip -type file 
New-Item c:\Data\Data_client6_$Timestamp.zip -type file 
New-Item c:\Data\Data_client7_$Timestamp.zip -type file 
exit 

腳本:

$folder='C:\Data' 
$clients = @("client1", "client2", "client3", "client4", "client5", "client6", "client7") 
$files = Get-ChildItem $folder -recurse -include @("*.zip") | 
    Where-Object {($_.CreationTime -gt (Get-Date).Date)} 

$files | Select-Object Name | Out-File $folder\result.txt 
$files | Where-Object { ($_.Name -replace '.+?_([^_]+).*', '$1') -notin $clients} | Out-File $folder\result2.txt 

回答

2

您需要:

$files | Select-Object Name | Out-File $folder\result.txt 

現在你可以使用Where-Object cmdlet來,抓住了客戶端名正則表達式確定每個丟失的客戶端要在某處(例如在一個名爲clients.csv的CSV文件中)有一個客戶端列表,然後您可以遍歷該列表來檢查是否爲每個客戶端找到了一個文件。例如:

$folder='C:\data' 
$Clients = Import-CSV Clients.csv 

$Files = Get-ChildItem $folder -recurse -include @("*.zip") | Where-Object {($_.CreationTime -gt (Get-Date).Date)} | select name 

$Clients | ForEach-Object { 
    $Client = $_ 
    $ClientCheck = $Files | Where-Object {$_ -like $Client} 
    If (-not $ClientCheck) { 
     Write-Warning "$Client is missing!" 
    }Else{ 
     Write-Output $ClientCheck 
    } 
} | out-file $folder\result.txt 
+0

謝謝馬克,我仍然檢查這一點。 – bRins

+0

我已經修改了我的答案,可以使用ForEach-Object循環,然後將結果輸出到您的文件中。 –

+0

如果您希望有關丟失文件的消息轉到單獨的錯誤文件,請用'add-content -value'替換該寫入警告$ Client is missing!「 -path $ folder \ missing.txt' –

3

開始與定義的客戶名單,你會想到這樣的:

$clients = @("client1", "client2") 

然後檢索所有壓縮文件和將其保存到變量中:

$files = Get-ChildItem $folder -recurse -include @("*.zip") | 
    Where-Object {($_.CreationTime -gt (Get-Date).Date)} 

出口現有的文件到您的Result.txt:

$fileClients = $files | ForEach-Object { ($_.Name -replace '.+?_([^_]+).*', '$1') } 
Compare-Object $clients $fileClients | select -ExpandProperty InputObject | Out-File $folder\result2.txt 
+0

我有文件夾填充文件client1到client7沒有文件client4。 $ files |選擇對象名稱| Out-File $ folder \ result.txt 這的確列出了今天創建日期的所有文件 $ files | Where-Object {($ _。Name -replace'。+?_([^ _] +)。'''''$ 1')-notin $ clients} | Out-File $ folder \ result2.txt 這應該在result2.txt中列出「client4 missing」,但result2爲空 – bRins

+0

您必須提供測試數據(一個用於創建文件的腳本以及您正在運行的腳本)重現它。然後我們可以提供一個答案。 –

+0

謝謝,我用腳本編輯了我的第一篇文章。 – bRins