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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1172閲覧

差分結果のファイル名表示について

-Yam-

総合スコア12

PowerShell

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/23 01:23

編集2021/08/30 08:20

実現したいこと

差分したファイル名をFileName列に表示させたいです。
それぞれファイル内容とファイル名を出すことは出来ますが、差分したファイル名とテキストの内容の表示されません。どうすれば一致できるのでしょうか。
ご教示いただけると幸いです。

差分対象($dir.listの中身)

Folder1 Folder2 ------- ------- C:\Dir1\Folder1\File1.txt  C:\Dir1\Folder2\File1-2.txt C:\Dir1\Folder1\File2.txt  C:\Dir1\Folder2\File2-2.txt

$diff.listの中身

FileName1  Data Result ---------  ---- ------        test1 ==        test1 =>        test <=        test2 =>        test22 <=

表示させたい結果

(例)Folder1内の各ファイルのテキスト内容と一致している場合は、Folder1内のファイル名表示   一致していない値は、Folder2内の各ファイルのテキスト内容と一致している場合、Folder2内のファイル名表示 FileName   Data Result ----------  ---- ------ File1.txt test1 == File1.txt test1 => File1-2.txt test <= File2.txt test2 => File2-2.txt test22 <=

試したこと1

『Replaceメソッド』で以下の条件FileName列に表示させることは出来ましたが、ファイル名を一致させる条件は一致出来ておりません。
※一部ソースを省略してます。

powershell

1 foreach ($d in $diff.list) { 2 foreach ($d2 in $dir.list) { 3 if (($d.Result -eq "==")-and ((Get-Content $d2.Folder1) -eq $d.Data)) { 4 $diff.Replace("==",'1') 5 }elseif (($d.Result -eq "<=")-and ((Get-Content $d2.Folder1) -eq $d.Data)) { 6 $diff.Replace("<=",'2') 7 }elseif (($d.Result -eq "=>")-and ((Get-Content $d2.Folder2) -eq $d.Data)) { 8 $diff.Replace("=>",'3') 9 } 10 } 11 }

試したこと2

『試したこと1』とは別に作成したところ以下の条件でファイル名をFileName列に表示させることは出来ましたが、ファイル名File2.txtしか表示できません。。
※一部ソースを省略してます。

powershell

1 if ($dir.list.Folder1.Split("\")[-1] -eq $dir.list.Folder2.Split("\")[-1]) { 2 $t = (Get-Content $dir.list.Folder1) 3 $s = (Get-Content $dir.list.Folder2) 4 $diffResult = Compare-Object $t $s -IncludeEqual 5 $diffResult | ft -a -wr @{label=”Line”;expression={$_.inputobject.readcount}},* 6 for ($i = 0; $i -lt $diffResult.Count; $i++) { 7 $filename = $dir.list.Folder1.Split("\")[-1] 8 } 9 } 10 11foreach ($d2 in $diffResult) { 12 foreach ($f in $filename) { 13 $diff.Add($f,$d2.inputobject.readcount,$d2.InputObject,$d2.SideIndicator) 14 }}

追記

・質問内容の変更・追記 2021.08.25

・試したこと2の追加 2021.08.30

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

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

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

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

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

guest

回答1

0

自己解決

以下のソースで表示できることが出来ました。
最初のforeach文で$dir.listを一つずつ処理をさせていなかったこと、Addする際に差分結果のみ回すことで余計な処理を無くしてファイル名表示されることが出来たのかなと思います。

powershell

1foreach ($d in $dir.list) { 2 if (($d.Folder1.Split("\")[-3] -eq $d.Folder2.Split("\")[-3]) -and ($d.Folder1.Split("\")[-1] -eq $d.Folder2.Split("\")[-1])) { 3  $fname = $d.Folder1.Split("\")[-1] 4  $t = (Get-Content $d.Folder1) 5  $s = (Get-Content $d.Folder2) 6 } 7 $Result = Compare-Object $t $s -IncludeEqual | 8 Select-Object -Property @{Name = 'line'; Expression = {$_.InputObject.ReadCount}} ,* 9 10foreach ($d2 in $Result) { 11 $diff.Add($Fname,$d2.inputobject.readcount,$d2.InputObject,$d2.SideIndicator) 12} 13

もしかしたら、ソースを今よりも簡潔に出来る方法があるかもしれませんが。。。

投稿2021/08/31 09:03

編集2021/08/31 09:04
-Yam-

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問