2017-02-23 88 views
0

在Windows 2008 R2,我有一個共享文件夾結構,這樣秀子文件夾修改日期以特定字符串

D:\USERS 

D:\USERS\USER1 
D:\USERS\USER1\AUTOBACKUP 
D:\USERS\USER1\DROP 
D:\USERS\USER1\EXHIBIT 

D:\USERS\USER2 
D:\USERS\USER2\AUTOBACKUP 
D:\USERS\USER2\DROP 
D:\USERS\USER2\EXHIBIT 

有被100個用戶文件夾,所有用戶在那裏AUTOBACKUP文件夾複製有重要的數據。每個AUTOBACKUP文件夾中都有幾個子文件夾和文件。

我的要求是隻顯示AUTOBACKUP文件夾名稱誰在過去1個月內沒有更新,意味着沒有寫入任何自動備份或其子文件夾中的文件。 (我不要求降/展品文件夾的細節,因爲它可以通過ANY1更新,但自動備份,只能通過相應的用戶進行更新)

結果是這樣的:

D:\USERS\USER1\AUTOBACKUP - Updated 
D:\USERS\USER2\AUTOBACKUP - ALERT: Not updated since last month ... 

或告訴我只會導致用戶其自動備份尚未從上個月更新。

我試圖通過powershell命令得到結果,但是如果有人更新drop/exhibit,它會向我顯示結果,並且我想在搜索條件中排除它們,搜索只應在自動備份中完成。

已更新: 好吧我正在嘗試下面的腳本,但被長路徑錯誤擊中。文件夾很深,意味着自動備份文件夾裏面有幾個子文件夾,並且文件名太長,因此會出錯。現在HOWTO解決這個問題:(

$users = Get-Content C:\myusers.txt 
$lastMonth = (Get-Date).AddMonths(-1) 
$backupfiles = Get-ChildItem $path -Recurse 
$logLocation = "D:\mylog.log" 
foreach ($user in $users){ 
    $path = "D:\Users\$user\AUTOBACKUP" 
    $backupfiles = Get-ChildItem $path -Recurse 
    foreach ($file in $backupfiles){ 
     $modifiedDate = $file.LastWriteTime 
     if ($modifiedDate -ge $lastMonth){ 
      $nobackup = $false 
      break 
      } else { 
      $nobackup = $true 
      } 
     } 
     if ($nobackup){ 
      Add-Content -Path $logLocation -Value "$filepath - NOBACKUP" 
     } 
    } 
+0

@ Get errorItem using 'Get-ChildItem -Path \\?\ d:'OR'Get-ChildItem -Path \\?\ d:\ temp'或者'Get-ChildItem -Path \\?\ d: 'OR「\\?\ $ path」 –

+0

嗯,get-childitem不支持它。使用IO類:'$ backupfiles =([IO.DirectoryInfo]「\\?\ $ path」)。GetFiles('*',[IO.SearchOption] :: AllDirectories' – wOxxOm

+0

@wOxxOm 好的我接受,我的技能太有限了。 IO_CLASS與完整的命令行語法,它在我的頭:),在此期間,我將繼續嘗試傳統的方法.... –

回答

3
Get-ChildItem 'D:\USERS' -Directory | ForEach-Object { 

    $RecentAutoBackupFiles = @(
     Get-ChildItem -Path "D:\USERS\$($_.Name)\AUTOBACKUP" -File -Recurse | 
      Where-Object { $_.LastWriteTime -ge [datetime]::Now.AddMonths(-1) } 
     ) 

    if (0 -eq $RecentAutoBackupFiles.Count) 
    { 
     "$($_.Name) - ALERT no files in AUTOBACKUP since 1 month ago" 
    } 
} 

未測試的最後寫入時間條件串...

+0

獲取以下錯誤 'PS D:\>。\ test.ps1 Get-ChildItem:找不到與參數名稱'Direct ory'匹配的參數。 在D:\ test.ps1:1 char:36 + Get-ChildItem'D:\ USERS'-Directory <<<<< |的foreach對象{ + CategoryInfo:InvalidArgument:(:) [獲取-ChildItem],ParameterB indingException + FullyQualifiedErrorId:NamedParameterNotFound,Microsoft.PowerShell.Comm ands.GetChildItemCommand' –

+0

哦,你正在使用PowerShell的2.0版,那將必須是'Get-ChildItem'D:\ USERS'|哪裏{$ _。PsIsContainer} | 「雖然我看到你有很長的路徑問題,但這個腳本不會做任何事情。 – TessellatingHeckler

+0

好吧,這工作。對時間ñ努力非常感謝 。欣賞它:) 現在只是我的頭撞在如何克服長路徑問題:)有點卡住它... –

1

嘗試是這樣的

Get-ChildItem D:\Users -Recurse -ErrorAction SilentlyContinue | ? { $_.IsContainer -and $_.Name -eq "AUTOBACKUP" } | Select fullname,@{Name="Status";Expression={if ($_.lastwritetime -lt ((Get-Date).AddMonths(-1))) { "Updated" } else { "ALERT: not updated since $($_.lastwritetime)" } }} 

這應該得到d的每個子對象:\用戶,則只能用「AUTOBACKUP」名稱進行篩選目錄,最後顯示已過濾的目錄的完整路徑+名稱和基於文件夾

+1

這是一個很好的測試,得到AUTOBACKUP文件夾本身的LastWriteTime?它似乎更新,如果一個文件是在文件夾內創建的,但不是如果在子文件夾內創建一個文件...? – TessellatingHeckler

+0

該命令應該在自動備份文件夾內的每個文件夾/子文件夾/文件中,如果發現沒有文件更新(自上個月以來未寫入),則應該警告。我猜這沒關係? –

+0

@Luca Clavarino,出現此錯誤,長路徑錯誤 'Get-ChildItem:指定的路徑,文件名或這兩者太長。完整 限定的文件名必須少於260個字符,並且目錄名mu st小於248個字符。 在線:1 char:14 ' –

相關問題