2012-02-17 50 views
0

我的目標是集中關於最後一次用戶備份何時完成的信息。創建腳本以返回最新日期文件的日期並將其附加到文件名

在我的網絡,我有備份運行到以下地點:

\\server\backup\user1 
\\server\backup\user2 
\\server\backup\user3 

等。

我的目標是運行一個腳本,它將檢查每個文件夾並返回每個文件夾中最新文件的日期附加到用戶名後的信息。

輸出會是這個樣子:

user1-2-17-12-1457 
user2-1-18-12-1312 
user3-2-6-12-0857 

其中2-17-12-1457代表在\服務器\備份\ user1的最新文件的日期和時間

該腳本將運行在Windows 2008 SBS機器上,所以無論提供給我的工具都可用。我運行了相對基本的批處理文件,但是我願意接受任何工作。

謝謝

+0

您確定要使用此日期格式嗎? user1-12-02-17-1457會使它們按照文件名的時間順序排序。 – mjolinor 2012-02-17 19:02:34

回答

2

像下面的東西應該做的伎倆。如果您擔心文件創建日期,請將「lastwritetime」的兩個實例替換爲「creationtime」。還需要調整最後的.tostring()格式,以防我沒有收集到您所需的時間戳的格式。

$directories = get-childitem "\\server\backup" | where-object { $_.psiscontainer } 

foreach ($dir in $directories) { 
    get-childitem $dir | sort-object lastwritetime | select-object -last 1 | foreach-object { $dir.name + $_.lastwritetime.tostring("-MM-dd-yy-hhmm") } 
} 

這應該輸出是這樣的:

copy-04-13-11-0213 
Fiddler2-10-21-10-0120 
My Received Files-11-14-11-0233 
net-09-03-10-1023 
OneNote Notebooks-02-07-12-0306 
SQL Server Management Studio-03-17-11-1056 
Visual Studio 2005-03-17-11-1056 
Visual Studio 2008-03-17-11-1048 
Visual Studio 2010-03-22-11-0650 
windowspowershell-11-07-11-0303 

編輯: 每評論..添加記錄到文件(其本身與當前日期加上時間戳),並使用FULLPATH,以確保我們不要不依賴於相對路徑。

$directories = get-childitem "\\server\backup" | where-object { $_.psiscontainer } 
$outFile = "C:\recentfiles" + (get-date).toString("-MM-dd-yy") + ".txt" 

foreach ($dir in $directories) { 
    get-childitem $dir.Fullname | sort-object lastwritetime | select-object -last 1 | foreach-object { $dir.name + $_.lastwritetime.tostring("-MM-dd-yy-hhmm") } | out-file $outFile -append 
} 
+0

這太棒了。我希望做的不同之處是數據的輸出。我對這個腳本的計劃是每晚在我的用戶備份的文件夾上每晚運行一次,我可以看到備份的狀態。我們可以讓劇本做到這一點嗎? – user1216920 2012-02-18 02:16:14

+0

我不關注,你期望做什麼不同?輸出到文件而不是控制檯?如果是這樣,應該很容易將輸出重定向,或者將管道重定向到您遵循的out-file -append – 2012-02-19 02:57:45

+0

。我想輸出到文件。正如我研究的,out-file正是我想要的。但說實話,這是我第一次看到PowerShell腳本,並可以使用一些指導。 – user1216920 2012-02-19 13:22:58

0

下面是一個在配置文件中遞歸搜索所有文件以查找最近寫入的文件的示例。然後它將該數據信息解析爲與初始文件夾名稱連接的字符串。

$Folders = @(
     "\\server\backup\user1", 
     "\\server\backup\user2", 
     "\\server\backup\user3" 
) 

$Folders | % { 
    $Directory = [System.IO.DirectoryInfo]$_ 
    $AllFiles = Get-ChildItem $_ -Recurse 
    $NewestDate = ($AllFiles | Sort-Object -property LastWriteTime -Descending)[0].LastWriteTime | Get-Date -Format "-M-d-yy-HHmm" 
    $NewFileName = "$($Directory.Name)$NewestDate" 
    $NewFileName 

} 
+0

這也很棒。有沒有辦法將數據輸出到文件名而不是屏幕? – user1216920 2012-02-19 14:46:08

+0

我能夠結合這兩個腳本,並完成我所需要的。我使用@riknik的lanaguage從目標目錄中動態拉取文件夾名稱。然後我用Geoff的腳本(在我眼裏)允許我創建一個新文件cmdlet。但是,我有一個問題 - 使用riknik的腳本,如果PS1文件與它正在測試的文件夾位於相同的文件夾中,則腳本只能正常運行。更確切地說,如果我將包含文件夾設置爲c:\ apps,但PS1文件位於c:\ powershell中,則腳本將無法正常運行。但是,如果我把PS1放在c:\ apps中,它會正常運行。 – user1216920 2012-02-19 15:28:45

+0

這是我目前的腳本:$ Folders = get-childitem「c:\ apps」|對象{$ _。psiscontainer} $ Folders | %{ $ Directory = [System.IO.DirectoryInfo] $ _ $ AllFiles = Get-ChildItem $ _ -Recurse $ NewestDate =($ AllFiles | Sort-Object -property LastWriteTime -Descending)[0] .LastWriteTime | Get-Date -Format「-M-d-yy -HHmm」 $ NewFileName =「$($ Directory.Name)$ NewestDate」 new-item c:\ status \ $ NewFileName -type file -force } – user1216920 2012-02-19 15:32:43

相關問題