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

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

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

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

PowerShell

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

Q&A

解決済

1回答

896閲覧

ハッシュ値の一致する中身が等しいファイルの絶対パスの組み合わせをテキストファイルに出力したい。

orange81

総合スコア1

変数

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

PowerShell

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

0グッド

0クリップ

投稿2022/03/31 11:22

バッチ作成の練習のため、下記のような「test」フォルダを作成し、
C:.
│ test-a.txt
│ test-b.txt

└─test2
│ test-a - 1.txt
│ test-c.txt

└─test3
test-a - 2ー.txt
test-d.txt

ファイル名に「a」のつくものは中身が「1」でそれ以外のファイルは適当な数字を入れています。

powershellで指定したフォルダの中のすべてのファイルのハッシュ値を比較して異なる絶対パスのファイルにハッシュ値の一致するファイルがあったら、その組み合わせをテキストファイルに出力するプログラムを作成しているが、指定したフォルダの絶対パスを入力した後にエラーもなく動作もなくなった。

実現したいこと

現在の問題を解決して無事にファイルの重複を知らせるテキストファイルを出力させたい。

発生している問題・エラーメッセージ

特になし 処理が終了しない。

該当のソースコード

powershell 5.1.19041.1320

$Folder_a = read-host 確認したいフォルダのパスを入力してください。

$PWD = get-location
[int]$i=0
[int]$j=0

$Path_a =@(get-childitem $Folder_a -recurse -Filter *.txt | select-object fullname)

$Hash_a =@(get-childitem $Folder_a -recurse -Filter *.txt | get-filehash -Algorithm MD5 | select-object hash)

if ($Path_a.length -ne $Hash_a.length)
{
echo "パスの総数とハッシュの総数が一致しません、処理を終了します。"
exit
}
else
{

while ($i=0 -le $Path_a.length-1) { [int]$j= 0 while ($j=0 -le $Path_a.length-1) { if ($Hash_a[$i] -eq $Hash_a[$j] -and $i -ne -$j) { echo $Path_a[$i] $Path_a[$j] >> $PWD\"重複".txt $j++ } else { $j++ } } $i++ }

}

試したこと

処理が終わらなかったためctrl+Cで中断後、「$Path_a」と「$Hash_a」を確認するとそれぞれ格納されていることを確認、

「$Path_a」

C:\Users\test\test-a.txt
C:\Users\test\test-b.txt
C:\Users\test\test2\test-a - 1.txt
C:\Users\test\test2\test-c.txt
C:\Users\test\test2\test3\test-a - 2ー.txt
C:\Users\test\test2\test3\test-d.txt

「$Hash_a」

C4CA4238A0B923820DCC509A6F75849B
C20AD4D76FE97759AA27A0C99BFF6710
C4CA4238A0B923820DCC509A6F75849B
202CB962AC59075B964B07152D234B70
C4CA4238A0B923820DCC509A6F75849B
81DC9BDB52D04DC20036DBD8313ED055

また、一見ハッシュ値が一致しているように見える値が等しいか確認すると

PS C:\Users\ユーザー名> $Hash_a[0] -eq $Hash_a[4]
False

PS C:\Users\ユーザー名> $Hash_a[0] -eq $Hash_a[2]
False

PS C:\Users\ユーザー名> $Hash_a[0] -eq $Hash_a[0]
True
となり、インデックスの値が一致しないとtrueにならないことを確認した。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
初めての利用で書き方が違っていたら申し訳ありません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

パイプラインでSelect-Objectの結果を得ると、ハッシュテーブルの形で保持されてしまうようですね。
無理やりシングルクォーテーションの文字列で囲んでみたら次のような出力が確認されました。
'@{Hash=C4CA4238A0B923820DCC509A6F75849B}'

ハッシュの文字列(単純にstring)で保持したいのでしたら次のようにすると良さそうでした。
(Get-FileHash filename.txt -Algorithm MD5).Hash

無限ループになってしまっているところは、
while ($i=0 -le $Path_a.length-1)を、
while ($i -le $Path_a.length-1)のようにすると良さそうでした。

投稿2022/03/31 12:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問