Dodanie daty do nazwy wielu plików w wielu folderach


1

Mam katalog zawierający ponad 400 podfolderów. W każdym z tych podfolderów codziennie pojawia się nowy plik. Każdy nowy plik ma taką samą nazwę jak plik, który pojawił się wczoraj w tym samym folderze. Każdy folder zawiera pliki o innych nazwach niż w innym folderze, ale nowe pliki w tym samym folderze zawsze mają tę samą nazwę. Nie chcę, aby pliki były nadpisywane codziennie. Zamiast tego chciałbym, aby Powershell dodał dzisiejszą datę po nazwie pliku i przed rozszerzeniem. Wiem, jak to zrobić dla pojedynczego podfolderu, ale nie chcę tworzyć ponad 400 skryptów (po jednym dla każdego podfolderu).

Jest to skrypt, który doskonale wykonuje zadanie dla każdego pojedynczego folderu .

$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
}

Chciałbym wiedzieć, jak zmodyfikować powyższy skrypt, aby wszystkie ponad 400 podfolderów mogły być zawarte w jednym skrypcie. Wiem, że mogę powtórzyć to samo polecenie ponad 400 razy i zapisać je jako jeden skrypt, ale nie jest to możliwe, ponieważ użytkownicy dodają nowe foldery bez informowania mnie. Z pewnością musi istnieć jakiś automatyczny sposób na uzyskanie wszystkich nowych plików, które pojawiły się w podfolderach.

Struktura folderów wygląda następująco:

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

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

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

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

Każda pomoc będzie mile widziana!

Odpowiedzi:


1

Jestem fanem prostoty, o ile nie wpływa to na wydajność ani działanie. Możesz dodać detektory, aby wykrywać, kiedy dodawane są nowe pliki i automatycznie zmieniać ich nazwy, ale jest to złożoność, której nie jestem teraz szczególnie zainteresowany uczeniem się, a tym bardziej wyjaśnianiem lol.

Tak więc po prostu bym poszedł.

Przede wszystkim musisz przeglądać te foldery:

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

Następnie, jak rozumiem, musisz sprawdzić, czy jest nowy plik (w zasadzie taki, który nie zawiera daty)

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

Połącz go ze swoim skryptem, uporządkowany, aby pasował:

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
    }
}

Ustaw zaplanowane zadanie, które będzie uruchamiane co pół godziny lub coś w tym stylu, a ty się śmiejesz.


Na marginesie, DZIĘKUJEMY, że nie używacie kropek do oddzielania dat. Nie masz pojęcia, jak wiele problemów nam to spowodowało ._.
Deadly-Bagel

Warto również zauważyć, że zakłada się, że w każdym folderze będzie tylko jeden plik, który nie ma daty na końcu. W przeciwnym razie musisz sprawdzić $newitem -is [array]i obsługiwać inną pętlę Foreach.
Deadly-Bagel

Dziękuję bardzo za odpowiedź! Myślałem o zapętleniu, ale nie mogłem wymyślić niczego, co łączyłoby te nazwy. Teraz, gdy zauważyłeś, że nowe pliki nie będą miały daty, wszystko wydaje się oczywiste! Dzięki twojej sugestii wiem już, co robić! Tak, zawsze będzie tylko jeden nowy plik (na szczęście!)
QWE,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.