我想开发一个脚本,用于记录给定目录中文件夹的大小,名称及其记录日期。我希望脚本以以下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文件中对其进行说明。
脚本每隔一段时间运行一次(每天?),并基本上在不断增加的大小CSV文件中附加一行名为' log.txt'。
到目前为止,我有一些代码可以通过我的文件夹进行递归并总结各自的大小,保存父文件夹的名称,大小和日期,并将所有这些信息楔入一个新对象,即然后扔进一个数组索引。当我试图让一堆相似的格式化对象看起来像我想要的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),将em保存为CSV,让脚本足够智能,以便在下次运行脚本时读取CSV并在记录时记录更改CSV文件的下一行。
有更好的方法吗?这是我超级潜伏一年之后的第一篇文章所以请成为gentel ...大声笑。
谢谢!
答案 0 :(得分: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 ";"
答案 1 :(得分: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