1

У меня есть каталог, который содержит более 400 подпапок. В каждой из этих подпапок каждый день появляется новый файл. Каждый новый файл имеет то же имя, что и файл, который появился вчера в той же папке. Каждая папка содержит файлы с разными именами, чем в другой папке, но новые файлы в одной и той же папке всегда имеют одинаковые имена. Я не хочу, чтобы файлы перезаписывались каждый день. Вместо этого я бы хотел, чтобы Powershell добавил сегодняшнюю дату после имени файла и перед расширением. Я знаю, как сделать это для одной подпапки, но я не хочу создавать более 400 сценариев (по одному для каждой подпапки).

Это скрипт, который отлично справляется с работой для каждой отдельной папки.

$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+ подпапок могли быть включены в один скрипт. Я знаю, что могу повторить одну и ту же команду 400+ раз и сохранить ее как один скрипт, но это невозможно, поскольку пользователи добавляют новые папки, не сообщая мне об этом. Конечно, должен быть какой-то автоматический способ получения всех новых файлов, которые появились в подпапках.

Структура папок выглядит так:

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 ответ1

1

Я болею за простоту, если это не влияет на производительность или функцию. Вы можете добавить слушателей, чтобы определять, когда добавляются новые файлы, и автоматически переименовывать их, но это сложность, которую я не особенно интересую изучать прямо сейчас, тем более объясняя, lol.

Так что я бы пошел простым циклом, если бы тогда.

Прежде всего вам нужно перебрать эти папки:

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

Установите запланированное задание на запуск каждые полчаса или около того, и вы будете смеяться.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .