2013-02-08 46 views
1

我想建立一种脚本,将日志文件夹的大小,在一个给定的目录,他们的名字的,以及日期,当他们被记录下来。我希望脚本在下面的CSV格式输出:PowerShell的CSV登录

Date;A;b;c;durga;New Folder;New Folder (2) 
0125-1416;0.00;0.05;1;1; 0.00 
0125-1417;0.00;0.05;0.00;0.00 
0125-1419;0.00;0.05;0.00;0.00;20;30 

最后,我希望脚本足够智能,为基于关闭该日志文件中,已经出现了文件夹,或者添加或删除。因此,如果我的根目录C:\ scripts具有文件夹A,B和C.我希望脚本知道我是否删除A,或者在下次运行时添加D,并在我的CSV文件中考虑此问题。

的脚本是(每天?)跑出,每隔一段时间,基本上添加一个新行名为“log.txt的”大小CSV文件的不断增加。

到目前为止,我有一些代码,通过我的文件夹递归并总结了它们各自的尺寸,节省了父文件夹的名称,它的大小和日期和楔子所有这些信息到一个新的对象,然后将其扔入一个数组索引。试图让一堆类似格式的对象看起来像我想要的CSV输出时,我迷失了方向。有一个更好的方法来获得一个CSV文件!

这里是我的代码“在一个给定的目录获取文件夹的大小”位:

cd C:\scripts 
$a = @() 
get-childitem | where {$_.PSIsContainer} | foreach { 
$size = (Get-ChildItem $_ -recurse | where {!$_.PSIsContainer} | Measure-Object -Sum Length).Sum 
$date = Get-Date -UFormat %Y%m%d-%H%M 
$size1 = "{0:n2}" -f ($size/1MB) 
$obj = new-object psobject 
add-member -inp $obj noteproperty date $date 
add-member -inp $obj noteproperty path $_.Name 
add-member -inp $obj noteproperty size $size1 
$a += $obj 
} 

我是新来的PowerShell的所以这是我得到难倒了:我的尺寸我文件夹,我不知道如何在$ a中提取我的对象,将它们全部格式化(比如我在帖子开始处张贴的示例CSV),将它们保存为CSV,让脚本足够智能在下次脚本运行时读取CSV并在记录CSV文件的下一行时考虑更改。

有没有更好的方式来做到这一点?这是我超级潜伏一年后的第一篇文章,所以请成为gentel ......大声笑。

谢谢!

回答

0

我试了一下。我替换了get-date格式以匹配输出,因为它们在您的示例中不匹配。这会为每个文件夹创建一列。列从不删除,只是添加。因此,如果添加新文件夹,则所有记录中都将显示一个新列,其值仅存在于其中的记录中。如果文件夹被删除,则以前的记录在该列中将具有空值。

cd C:\scripts 
$filename = "log.csv" 
$out = @() 

$date = Get-Date -Format MMdd-HHmm 

#Create new record 
$rec = New-Object psobject -Property @{ 
    Date = $date 
} 

Get-ChildItem | where {$_.PSIsContainer} | foreach { 
    $size = (Get-ChildItem $_.FullName -recurse | where {!$_.PSIsContainer} | Measure-Object -Sum Length).Sum 
    $rec | Add-Member -MemberType NoteProperty -Name $_.Name -Value ("{0:n2}" -f ($size/1MB)) 
} 


#Check if file exists and get columns 
if (Test-Path $filename -PathType Leaf) { 
    $in = Import-Csv $filename 
    $incol = $in | Get-Member -MemberType NoteProperty | % { $_.Name } 
    $reccol = $rec | Get-Member -MemberType NoteProperty | % { $_.Name } 

    #Add missing columns to exisiting records 
    Compare $incol $reccol | ? { $_.SideIndicator -eq "=>" } | % { $in | Add-Member -MemberType NoteProperty -Name $_.InputObject -Value $null } 
    #Add missing columns to new record 
    Compare $reccol $incol | ? { $_.SideIndicator -eq "=>" } | % { $rec | Add-Member -MemberType NoteProperty -Name $_.InputObject -Value $null } 

    $out += $in 
} 

$out += $rec 

$out | Export-Csv $filename -NoTypeInformation 
+0

这正是我所期待的。谢谢格雷默。我正在一条一条地睁大眼睛。有用!纯粹的巫术! – user2011812 2013-02-09 17:07:14

+0

Np:)这是一个有趣的挑战。如果您认为这是最佳答案,请将其标记为答案(答案旁边的复选标记)。 – 2013-02-09 23:32:10

1

可以使用Export-csv commandlet输出数据为CSV文件。你只需要管你的数组值到它:

$a | Export-Csv -NoTypeInformation -path log.txt 

它也像你想使用一个分号作为分隔符而不是逗号,你可以做到这一点:

$a | Export-Csv -NoTypeInformation -path log.txt -Delimiter ";" 

然后阅读您的csv的内容,使用import-csv commandlet并将结果存储在一个变量中。

$b = import-csv -Path .\log.txt -Delimiter ";" 
+0

我敢肯定他的问题更多是格式化数据,然后实际导出:) – 2013-02-08 22:13:01