2012-02-17 51 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

相关问题