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

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

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

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

Q&A

解決済

1回答

1539閲覧

フォルダ内に重複しているファイル名(.csv)の存在確認及び削除

jackal1978

総合スコア33

PowerShell

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

0グッド

0クリップ

投稿2022/08/17 02:57

編集2022/08/17 05:48

前提

c:testフォルダ内に以下の条件で.csvファイルが格納されていて重複したファイル名の存在確認と削除をしたい
以下の格納先例の頭のXの部分はハイフン含むコンピュータ名になります。
このコンピュータ名がフォルダ内に重複していた場合に1つだけ残してあとは削除する仕掛けを作成したい。(残すのはどれでもよい)
(日付、時間についてはcsvを出力した時のものになるので重複しません。)

格納先例
XXXXX-XXXXXXXXX_日付_時間.csv

格納先イメージ(★が一致)
tokyo-WINA10111_日付_時間.csv←★
tokyo-WINB10133_日付_時間.csv
tokyo-WINC10111_日付_時間.csv
tokyo-WINA10111_日付_時間.csv←★

実現したいこと

特定フォルダ内に対して一部重複したファイル名の存在確認と重複したファイルがあった場合に削除するスクリプトの作成

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

エラーメッセージ

該当のソースコード

ソースコード path="C:\test" $file=(Get-ChildItem $path\*csv).BaseName $name = $file.SubString(0,15)

一覧の取得
コンピュータ名のみ抽出

試したこと

フォルダ内のコンピュータ名のみの抽出はできたのですがそこから一致するものを削除する方法についてご教示ください。

先頭の文字数を取得して比較するのか、何か別の方法で重複を検索する方法があるのか当方Powershellが初心者のため
よろしくお願いいたします。

https://qiita.com/kurosworld/items/35060a3e695df9feaa0a

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

dodox86

2022/08/17 05:21 編集

現在調査中、とありますが、こういうローカルな仕様、要望のプログラムは検索してもピッタリなものは見つからないので、基本の理解をもとに自身で作り上げる方が早いし適切です。PowerShellに限りません。 > 先頭の文字数を取得して比較するのか、何か別の方法で重複を検索する方法があるのか 別にどうやっても要望通りの結果になれば良いだけです。例えばファイル一覧を作ってファイル名でソートしてからひとつずつ見ていき、直前のコンピュータ名に相当するファイルが連続していたらそれは重複しているということなので、それらは削除すれば良いです。
guest

回答1

0

ベストアンサー

■テスト用ファイル

tokyo-WINA10111_20220101_000001.csv tokyo-WINA10111_20220101_000002.csv tokyo-WINB10133_20220101_000001.csv tokyo-WINC10111_20220101_000001.csv tokyo-WINC10111_20220101_000002.csv tokyo-WINC10111_20220101_000003.csv

■存在確認

PowerShell

1$path = "C:\test" # 格納場所 2$file = (Get-ChildItem $path\*.csv).BaseName # 3if ( $file.count -ne 0 ){ 4 $Header = $file.SubString(0,15) # ヘッダーを取り出します。 5 $Datas = $Header | Group-Object -noelement # ヘッダーをグループ化します。 6 foreach ($Data in $Datas){ 7 if ( $Data.Count -gt 1 ){ 8 Write-host ■重複ヘッダー → $Data.Name $Data.Count 個 9 } 10 } 11} 12 13# 14# 実行結果 15# 16 17# ■重複ヘッダー → tokyo-WINA10111 2 個 18# ■重複ヘッダー → tokyo-WINC10111 3 個

■重複を1個残して削除

PowerShell

1$path = "C:\test" # 格納場所 2$file = (Get-ChildItem $path\*.csv).BaseName # 3if ( $file.count -ne 0 ){ 4 $Header = $file.SubString(0,15) # ヘッダーを取り出します。 5 $Datas = $Header | Group-Object -noelement # ヘッダーをグループ化します。 6 foreach ($Data in $Datas){ 7 if ( $Data.Count -gt 1 ){ 8 $DeleteFiles = @(Get-ChildItem -LiteralPath $path | Where-Object {-not $_.PSIsContainer} | Where-Object {$_.BaseName -match $Data.Name} | Select-Object -Skip 1 | ForEach-Object {$_.FullName}) # 1個残して削除するパス 9 foreach ($DeleteFile in $DeleteFiles){ 10 Write-host ■削除するパス $DeleteFile 11 # Remove-Item $DeleteFile -Force # 削除 ※削除する場合、コメント#を外してください。 12 } 13 } 14 } 15} 16 17# 18# 実行結果 19# 20 21# ■削除するパス C:\test\tokyo-WINA10111_20220101_000002.csv 22# ■削除するパス C:\test\tokyo-WINC10111_20220101_000002.csv 23# ■削除するパス C:\test\tokyo-WINC10111_20220101_000003.csv

投稿2022/08/17 13:37

ccc-

総合スコア342

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

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

jackal1978

2022/08/18 00:26

こちらの環境で実施してみたところ想定の動作をいたしました。 重複部分から先のところがわからなかったのですがとても勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問