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の例のように私の投稿の冒頭に向かって)、em を CSV として保存し、次回スクリプトを実行するときに CSV を読み取れるようにスクリプトをインテリジェントにし、CSV ファイルの次の行を記録するときに変更を考慮します。

これを行うより良い方法はありますか?1年ぶりの投稿なのでお手柔らかにお願いします…笑。

ありがとうございました!

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サンプルで一致しなかったため、出力に一致するようにフォーマットを置き換えました。これにより、フォルダごとに 1 つの列が作成されます。列が削除されることはなく、追加されるだけです。したがって、新しいフォルダが追加されると、すべてのレコードに新しい列が表示され、その列が存在するレコードのみに値が表示されます。フォルダーが削除された場合、以前のレコードはその列に null 値を持ちます。

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 に答える