0

ファイルのリストをあるディレクトリから別のディレクトリに移動しようとしています。問題は、アイテムが新しいディレクトリに移動されたときに、それらを自動的に整理したいということです。

例.何千ものファイル名のフォルダーがあります。

すべてのファイル名は、ユーザーのユーザー ID に関連しています。一部のユーザーはこのフォルダーに複数のファイルを持っているため、名前の末尾に番号が追加されます。IE susy.txt, susy1.txt, susy2.txt, carl.txt,carl1.txtなど...

私がやろうとしているのは、複数のファイルを持つユーザーごとに (新しいディレクトリに) 特定のフォルダーを作成し、関連するすべてのファイルをそのフォルダーに移動することです。そのため、複数の susy ドキュメントがあることに気付きました。そこで、Susy という名前のフォルダを作成し、その中にsusy.txtsusy1.txt、およびsusy2.txt... などをすべてのファイルに配置します。

これをバッチファイルとして実行することさえ可能ですか? 私はバッチ スクリプトの記述について少し知識があり、これを機会にもっと学びたいと思います。


これは、私が以前に尋ねた質問と非常によく似ています。Powershell でのファイルとフォルダーの操作。私が受け取った回答にとても感謝しています。彼らは私を大いに助けてくれました。Adi Inbarからの回答は、まさに当時の私が必要としていたものでした。ただし、変更を余儀なくされたので、自分で試しました。

アディ・インバーの答え

Get-ChildItem | ?{$_.Name -match '(\D+)\d*\.txt'} | %{
  md $matches[1] -ea SilentlyContinue 
  Move-Item $_ $matches[1]
}

甘くて要点が足りない、まさに私が必要としていたものです。ただし、整理されるが同じ親フォルダーにとどまるファイルに対してのみ機能します。

これは私が試みたものです:

Get-ChildItem –path "P:\My Documents\Org Test\Test1" | Where{$_.Name -match '(\D+)\d*\.txt'} | Foreach{
     md P:\'My Documents'\'Org Test'\Test2\$matches[1] -ea SilentlyContinue
     Move-Item $_ P:\'My Documents'\'Org Test'\Test2\$matches[1]
}

私の知る限り、これは機能するはずです...しかし、 Move-Item : Cannot create a file when that file already exists. というエラーが表示されます。

At P:\My Documents\Org Test\Test.ps1:3 char:3
    +      Move-Item -Path P:\'My Documents'\'Org Test'\Test1\$_ -destination P:\'M ...
    +    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : WriteError: (P:\My Documents...t1\Johnny123.txt:FileInfo) [Move-Item], I
        + FullyQualifiedErrorId : MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

舌先にあるのは確かなのですが、わかりません。私は非常に基本的な PowerShell スクリプトの経験があり、簡単な修正が必要です。


編集:

このスクリプトを使用して、問題を「解決」できました。

Get-ChildItem –path P:\'My Documents'\'PST Org Script'\Test1 | Foreach-Object{ 
    move-item -Path $_.fullname -Destination "P:\My Documents\PST Org Script\Test2" -ea SilentlyContinue }

cd P:\'My Documents'\'PST Org Script'\Test2

Get-ChildItem | ?{$_.Name -match '(\D+)\d*\.txt'} | %{
  md $matches[1] -ea SilentlyContinue 
  Move-Item $_ $matches[1]
} 

気になります。これは、上記の 3 行のコードで実行できると思います。これは少し冗長なようです。しかし、私は何を知っていますか。

ありがとう

4

2 に答える 2