複数のフォルダー内の複数のファイルの名前に日付を追加する


1

400個以上のサブフォルダーを含むディレクトリがあります。この各サブフォルダーには、毎日新しいファイルが表示されます。それぞれの新しいファイルは、昨日同じフォルダに現れたファイルと同じ名前を持っています。各フォルダーには、他のフォルダーとは異なる名前のファイルが含まれますが、同じフォルダー内の新しいファイルには常に同じ名前が付けられます。ファイルを毎日上書きしたくない。代わりに、Powershellに今日の日付をファイル名の後、拡張子の前に追加してもらいたいです。単一のサブフォルダーに対してそれを行う方法は知っていますが、400個以上のスクリプト(サブフォルダーごとに1つ)を作成したくありません。

これは、各単一フォルダに対して完全にジョブを実行するスクリプトです。

$fileToRename = "E:\Backup\ABLBackup\folder1\Project1.txt"
if (Test-Path $fileToRename)

    {
    $fileName = [system.io.path]::GetFileNameWithoutExtension($fileToRename)
    $dateSuffix = get-date -Format 'yyyy_MM_dd'
    $fileExtension = [system.io.path]::GetExtension($fileToRename)
    $newFileName = '{0}_{1}{2}' -f $fileName, $dateSuffix, $fileExtension
    Rename-Item -Path $fileToRename -NewName $newFileName
}

400以上のすべてのサブフォルダーを1つのスクリプトに含めることができるように、上記のスクリプトを変更する方法を知りたいです。同じコマンドを400回以上繰り返して1つのスクリプトとして保存できることは知っていますが、ユーザーに通知せずに新しいフォルダーを追加するため、実行できません。確かに、サブフォルダーに現れたすべての新しいファイルを自動的に取得する方法がなければなりません。

フォルダーの構造は次のようになります。

E:\ Backup \ ABLBackup \ folder1 \ Project1.txt

E:\ Backup \ ABLBackup \ folder2 \ Project2.txt

E:\ Backup \ ABLBackup \ folder3 \ Project3.txt

E:\ Backup \ ABLBackup \ folder4 \ Project4.txt

どんな助けも大歓迎です!

回答:


1

パフォーマンスや機能に影響を与えない限り、物事をシンプルに保つことが好きです。リスナーを追加して、新しいファイルが追加されたことを検出し、自動的にそれらの名前を変更することもできますが、それは今の学習にはあまり興味がなく、あまり説明されていない複雑さです。

したがって、単純なループイフゼンの方法を使用します。

まず、これらのフォルダーをループする必要があります。

Get-ChildItem "E:\Backup\ABLBackup" |
  Where PSIsContainer |
  Foreach-Object {}

次に理解するように、新しいファイル(基本的には日付を含まないファイル)があるかどうかを確認する必要があります

if (Get-ChildItem $_.FullName | Where Name -notlike "*_????_??_??.*") {}

スクリプトに合わせて、適切に調整します。

Get-ChildItem "E:\Backup\ABLBackup" |
  Where PSIsContainer |
  Foreach-Object {
    $newitem = Get-ChildItem $_.FullName | Where Name -notlike "*_????_??_??.*"
    if ($newitem)
    {
        $dateSuffix = get-date -Format 'yyyy_MM_dd'
        $newFileName = '{0}_{1}{2}' -f $newitem.BaseName, $dateSuffix, $newitem.Extension
        Rename-Item $newitem -NewName $newFileName
    }
}

30分ごとなどに実行するようにスケジュールされたタスクを設定すると、笑っています。


サイドノートとして、日付を区切るためにピリオドを使用しなかったことに感謝します。ここで私たちがどれほどのトラブルを引き起こしたのか、あなたにはわかりません。
致命的なバグ

また、これに注意する価値があるのは、各フォルダーにファイルが1つしかなく、最後に日付がないことを前提とすることです。$newitem -is [array]それ以外の場合は、別のForeachループで確認して処理する必要があります。
致命的なバグ

ご回答ありがとうございました!ループについて考えましたが、名前に共通するものを思い付くことができませんでした。新しいファイルには日付がないことを指摘したので、すべてが明らかです!あなたの提案のおかげで、私は今何をすべきかを知っています!はい、新しいファイルは常に1つだけです(幸運なことに!)
QWE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.