1

我想开发一个脚本来记录给定目录中文件夹的大小、它们的名称以及它们被记录的日期。我希望脚本以以下 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 文件的下一行时考虑更改。

有一个更好的方法吗?这是我潜伏一年后的第一篇文章,所以请温柔点……哈哈。

谢谢!

4

2 回答 2

1

您可以使用Export-csv命令行开关将数据输出为 csv 文件。您只需要将数组值通过管道传输到其中:

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

看起来您也想使用分号而不是逗号作为分隔符,您也可以这样做:

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

然后读取 csv 的内容,使用import-csv命令行开关并将结果存储在变量中。

$b = import-csv -Path .\log.txt -Delimiter ";"
于 2013-02-08T22:05:21.530 回答
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
于 2013-02-08T22:55:20.823 回答