質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

4494閲覧

ハッシュ値で洗い出した重複ファイルのサイズや更新日を取得したい

TAHA

総合スコア16

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2018/03/21 06:22

お世話になっております。

Powershellで、ある作業フォルダにあるファイル一覧を取得しHash一覧を作成して、ハッシュ値とフルパスの一覧をcsv出力するまでは成功できましたが、サイズと更新日の値を取得することに苦心しています。

下記の通り、列を作成しましたが、Size, Dateがブランクのままです。
Select Hash, Patch, Size, Date

重複ファイルのサイズ(MB)と更新日(YYYYMMDD)を取得し、Exportした一覧に表示するよう改修したく、アイデアありましたら教えて頂けますでしょうか。

以下PowershellのVersionになります。

PS D:\work> $PSVersionTable

Name Value


PSVersion 5.0.10586.117
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.10586.117
CLRVersion 4.0.30319.36415
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1

こちらが実際のコードになります。

# ワーキングディレクトリ設定/ファイル一覧対象ディレクトリルート設定/タイムスタンプ取得 $wDir = "D:\work" $lRoot = "D:\work\test" $fTimeStamp = Get-Date -Format "yyyyMMdd-hhmmss" # ワーキングディレクトリへ移動 cd $wDir # ファイル一覧情報取得 Write-Host (Get-Date) Write-Host Getting File List ... $fList = Get-ChildItem -Path $lRoot -Recurse | Where-Object {$_.Length -ge 1MB} $lCount = $fList.count # Hash一覧作成 $fPath = ".\"+$fTimeStamp+"_Hashlist.csv" Write-Host $fPath for ($i = 0;$i -lt ($lCount);$i++){ $pPer=$i/($lCount - 1)*100 Write-Progress -Activity "Hash一覧作成中" ` -PercentComplete $pPer ` -CurrentOperation "$lCount : $pPer% complete" ` -Status "しばらくお待ちください。" $fList[($i)] | ` Get-FileHash -Algorithm MD5 | ` Select Hash,Path,Size,Date | ` Export-CSV -NoTypeInformation -Path $fPath -Append } # Hash一覧データレコード数取得 $fRecord=(Import-Csv -Path $fPath).Length # ファイル件数,Hashレコード数比較 IF ($lCount -eq $fRecord){ Write-Host Match Record Count. Complete. } ELSE { Write-Host Not Match Record Count. Error. } Read-Host "Press Any Key"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

質問のコードの問題

Select-Objectコマンドレットは通常は、入力されたオブジェクトに存在するプロパティしか取得することができません。

今回はHash,Path,Size,Dateと指定していますが、パイプラインに流れてくるMicrosoft.Powershell.Utility.FileHash型の中では、HashとPathしか名前が一致しないため、残りのSize、Dateはヌルが入ります。

そもそも$fListの中身として期待されるSystem.IO.FileInfo型にもSize、Dateという名前のプロパティは存在しません。


指定した名前でプロパティを取得する

Select-ObjectのProperyパラメータですが、プロパティの名前(文字列)の代わりに以下の形式のハッシュテーブルを渡すと、指定した名前で、スクリプトブロックの結果の値を持つプロパティを新たに定義できます。

@{ Name="新しい名前"; Expression={"値を取得するスクリプトブロック"} }

例えば、Sizeという名前でファイルの大きさを取得する場合は以下のようにします。

# 指定するハッシュテーブル # @{Name="Size";Expression={$_.Length}} Get-ChildItem -File | # ファイルの名前と大きさだけを表示(表示名はNameとSize) Select-Object -Property Name, @{Name="Size";Expression={$_.Length}}

この場合、Select-Objectの後ろが長くなってやや見にくいため、スプラッティングなどを使うと、多少見やすくなります。

# Select-Objectに渡す引数 $selectObjectArgs = @{ # プロパティパラメータに Property = @( #配列を指定 "Name" @{Name="Size";Expression={$_.Length}} @{Name="Date";Expression={$_.LastWriteTime}} ) } Get-ChildItem -File | # NameとSizeとDateが表示される Select-Object @selectObjectArgs

ちなみにExpressionに指定するのはスクリプトブロックですので、必要であれば任意のコマンドを実行することもできます。

此処までの内容を踏まえればやりたいことは概ねできるかと思います。

投稿2018/03/21 13:27

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

$fList にファイル情報が入っています。
LastWriteTime で最終更新日時を、Length でサイズを取得できます。

次のようにしてどう表示されるか確かめてみてください。

Get-ChildItem | ForEach-Object { $_.LastWriteTime, $_.Length }

投稿2018/03/21 07:55

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問