2016-09-30 9 views
0

をCSVファイルにフォルダ内のファイルのタイムスタンプのリストをエクスポートし、私のPowersShellスクリプトを改善する私は、コードのこの部分を持っている:は今のところ

$items = @() 
$OutputFilePath = "c:\csv\text1.csv" 

dir -Force -Recurse | foreach { 
    $FullName = $_.FullName    
    $Creation = $_.CreationTimeUtc  
    $Modified = $_.LastWriteTimeUtc 
    $Accessed = $_.LastAccessTimeUtc 
    $Size  = $_.Length 
    $Atributes = $_.Attributes 

    $i = New-Object -TypeName psobject 
    $i | Add-Member -MemberType NoteProperty -Name FullName   -Value $FullName 
    $i | Add-Member -MemberType NoteProperty -Name CreatedDateUtc  -Value $Creation 
    $i | Add-Member -MemberType NoteProperty -Name CreatedTimeUtc  -Value $Creation.TimeOfDay 
    $i | Add-Member -MemberType NoteProperty -Name CreatedTicksUtc -Value $Creation.Ticks 
    $i | Add-Member -MemberType NoteProperty -Name ModifiedDateUtc -Value $Modified 
    $i | Add-Member -MemberType NoteProperty -Name ModifiedTimeUtc -Value $Modified.TimeOfDay 
    $i | Add-Member -MemberType NoteProperty -Name ModifiedTicksUtc -Value $Modified.Ticks 
    $i | Add-Member -MemberType NoteProperty -Name AccessedDateUtc -Value $Accessed 
    $i | Add-Member -MemberType NoteProperty -Name AccessedTimeUtc -Value $Accessed.TimeOfDay 
    $i | Add-Member -MemberType NoteProperty -Name AccessedTicksUtc -Value $Accessed.Ticks 
    $i | Add-Member -MemberType NoteProperty -Name Size    -Value $Size 
    $i | Add-Member -MemberType NoteProperty -Name Atributes   -Value $Atributes 
    $items += $i 
} 

$FileExists = Test-Path $OutputFilePath 
if ($FileExists -eq $False) { 
    $items | Export-Csv -Path $OutputFilePath -NoClobber -Encoding UTF8 
} else { 
    [System.Windows.Forms.MessageBox]::Show("The output file already exists. Please delete or rename it to continue." ,"Error", 0, [System.Windows.Forms.MessageBoxIcon]::Error) 
} 

それは私のすべてのオブジェクトのUTCタイムスタンプのリストを与えますフォルダとサブフォルダ。 (私は、UTCのタイムスタンプが非UTCのタイムスタンプよりもはるかに有用であることを発見しました。なぜなら、私はVirtual Realityの天候タイムラプスサービスのコンセプトに取り組んでいますし、夏時間が始まり終わる日のエラーは受け入れられないためです。他のケースでは受け入れられません)。私が欠けているのは、親フォルダ自体のタイムスタンプです。

親フォルダのタイムスタンプもどうやって含めることができますか?

答えて

3

カレントディレクトリにGet-Itemを追加します。問題を解決アンスガーWiechersの答えに加えて

$(Get-Item .; Get-ChildItem . -Recurse -Force) | ForEach-Object { 
    ... 
} 
3

を:

  • 一度に代わりのメンバーにどの一つずつ追加PSObjectを作成します。遅いです
  • 遅い各繰り返しで配列を再作成することなく出力をパイプします

$OutputFilePath = "c:\csv\text1.csv" 

if (Test-Path $OutputFilePath) { 
    [System.Windows.Forms.MessageBox]::Show(
     "The output file already exists. Please delete or rename it to continue.", 
     "Error", 
     0, 
     [System.Windows.Forms.MessageBoxIcon]::Error 
    ) 
} else { 
    $(gi .; dir -Force -Recurse) | %{ 
     New-Object PSObject -Property @{ 
      FullName   = $_.FullName 
      CreatedDateUtc = $_.CreationTimeUtc 
      CreatedTimeUtc = $_.CreationTimeUtc.TimeOfDay 
      CreatedTicksUtc = $_.CreationTimeUtc.Ticks 
      ModifiedDateUtc = $_.LastWriteTimeUtc 
      ModifiedTimeUtc = $_.LastWriteTimeUtc.TimeOfDay 
      ModifiedTicksUtc = $_.LastWriteTimeUtc.Ticks 
      AccessedDateUtc = $_.LastAccessTimeUtc 
      AccessedTimeUtc = $_.LastAccessTimeUtc.TimeOfDay 
      AccessedTicksUtc = $_.LastAccessTimeUtc.Ticks 
      Size    = $_.Length 
      Atributes  = $_.Atributes 
     } 
    } | Export-Csv -Path $OutputFilePath -NoClobber -Encoding UTF8 
} 

あなたがそれらの好きだので、私は別名(Get-Itemforeachため%gi)を使用しました。

+0

ありがとうございました。私はすでにそれがどれほど遅いか気付いていました。私がまだ理解していない他のプログラミング言語に切り替える必要があるかどうかは疑問でした。 –

+0

あなたのコードはうまくいきません。多くのエラーメッセージが表示されます。 'ヌル値の式でメソッドを呼び出すことはできません。ラインで :12文字:9 + [PSObject] + ~~~~~~~~~~~~ + CategoryInfo {@:はInvalidOperation:(:) []、のRuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull」 –

+0

参照更新されたコード、私はちょうど修正したエラーがあった。 – wOxxOm

関連する問題