PowerShellでファイルの詳細情報をとる

excelやwordファイルのプロパティを見ると「詳細」タブにいろいろ情報が入っている。

これをPowerShellでファイル情報を収集する際に載せれるように調査した。

面倒なのがPowerShellの標準機能では収集できず、Shell.Application を使って収集するのだが、ストレートに各ファイルの情報をとるのではなく、そのファイルが置いてあるフォルダ情報のなかから取得する、という手法をとる必要がある。

前回作った「PowerShellを使ってドロップしたフォルダ内にあるファイル一覧をテキストファイルに保存する」を修正したものがこちら

# ドラッグされたフォルダの中にあるファイル一覧をつくるやつ
#
# 使い方
#  1. このファイルを保存する
#  2. このファイルのショートカットを作成する
#  3. ショートカットのプロパティを開き"リンク先"の項目の先頭に「powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File 」をつけて保存
#  4. 作成されたショートカットの上に、フォルダをドロップすると、ウィンドウが開いて確認される
#  5. 作成するファイルリストの保存ファイル名を指定する
#  6. 出力される
#
$Args | foreach{
    echo $_.GetType()
    $searchdir = Get-Item -LiteralPath $_
}

Write-Host $searchdir.FullName "のファイル一覧を作成します"
pause

$shell = New-Object -COMObject Shell.Application

# https://pg-note.com/archives/1144 より
# 必要なアセンブリを読み込む
Add-Type -AssemblyName System.Windows.Forms 
$dialog = New-Object Windows.Forms.SaveFileDialog 

$dialog.Title = "CSVファイルの保存" 
$dialog.Filter = "テキストファイル(*.txt)|*.txt|csvファイル(*.csv)|*.csv|全てのファイル|*.*" 
$dialog.InitialDirectory = [Environment]::GetFolderPath("MyDocuments")
$dialog.FileName = $searchdir.Name

$ret = $dialog.ShowDialog() 
$outputfile=$dialog.FileName

# CSV出力向けの処理
$results=@()
$linecount=0
#


if ($ret -eq "OK"){
    Write-Host ("保存するファイル名、" + $outputfile) 

    # ディレクトリの検索 start
    Get-ChildItem -Recurse $searchdir -Attributes Hidden,System,Archive,ReadOnly,Normal,Compressed,SparseFile| ForEach-Object {
    $filename=$_.FullName
    $fileobject=$_

        if( !$_.PSIsContainer ){
            Write-Host $filename
            
            # CSV向け処理 start
            $output = New-Object -TypeName PSObject
            $output | Add-Member -MemberType NoteProperty -Name "ファイル名" -Value $filename
            $output | Add-Member -MemberType NoteProperty -Name "作成日" -Value ($fileobject.CreationTime|Get-Date -Format "yyyy-MM-dd HH:mm:ss")  # $fileobject.CreationTimeUtc
            $output | Add-Member -MemberType NoteProperty -Name "サイズ" -Value $fileobject.Length
            $output | Add-Member -MemberType NoteProperty -Name "ハッシュ(sha256)" -Value (Get-FileHash -LiteralPath $filename -Algorithm SHA256).Hash

            $Getfolder = $shell.Namespace($fileobject.DirectoryName)
            $Getfile = $Getfolder.ParseName($fileobject.Name)
            $output | Add-Member -MemberType NoteProperty -Name "タイトル" -Value $Getfile.ExtendedProperty('System.Title')
            $output | Add-Member -MemberType NoteProperty -Name "件名" -Value $Getfile.ExtendedProperty('System.Subject')
            #$output | Add-Member -MemberType NoteProperty -Name "作成者" -Value ([string]$Getfile.ExtendedProperty('System.Author'))
            #  なぜか直接出力すると System.strings になるので、 string に変換
            $tmps=[string]$Getfile.ExtendedProperty('System.Author')
            $output | Add-Member -MemberType NoteProperty -Name "作成者" -Value $tmps
            $output | Add-Member -MemberType NoteProperty -Name "前回保存者" -Value $Getfile.ExtendedProperty('System.Document.LastAuthor')
            $output | Add-Member -MemberType NoteProperty -Name "コンテンツの作成日時" -Value $Getfile.ExtendedProperty('System.Document.DateCreated')
            $output | Add-Member -MemberType NoteProperty -Name "前回保存日時" -Value $Getfile.ExtendedProperty('System.Document.DateSaved')
            $output | Add-Member -MemberType NoteProperty -Name "前回印刷日" -Value $Getfile.ExtendedProperty('System.Document.DatePrinted')
            #$output | Add-Member -MemberType NoteProperty -Name "ファイル所有者" -Value $Getfile.ExtendedProperty('System.FileOwner')
            #$output | Add-Member -MemberType NoteProperty -Name "ファイル作成日時" -Value $Getfile.ExtendedProperty('System.DateCreated')
            #$output | Add-Member -MemberType NoteProperty -Name "ファイル更新日時" -Value $Getfile.ExtendedProperty('System.DateModified')
            #$output | Add-Member -MemberType NoteProperty -Name "ファイルアクセス日時" -Value $Getfile.ExtendedProperty('System.DateAccessed')

            $results+=$output
            $linecount++
            # CSV向け処理 end

            if(($linecount % 1000) -eq 0 ){
                $results | Export-Csv $outputfile -Encoding UTF8 -NoTypeInformation -Append -NoClobber
                $results = @()
            }
        }
    }
    # ディレクトリの検索 end

    $results | Export-Csv $outputfile -Encoding UTF8 -NoTypeInformation -Append -NoClobber
} else {
    Write-Host ("キャンセル") 
}


pause

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.