Переименование списка файлов и создание папки в Powershell - PullRequest
1 голос
/ 27 июля 2011

Мне нужен скрипт в PowerShell или пакетный скрипт, который будет выполнять следующие действия.

  1. Переименуйте файл, чтобы добавить дату создания минус 1 день к имени файла.

    Например:

    foo.xlsx (создано 27.07.2011)

    foo-2011-07-26.xlsx - примечание, это вчерашняя дата.

    Формат даты не слишком важен, если он там есть. Будет 10 файлов (все с одинаковой датой создания), поэтому я могу скопировать и вставить одну и ту же строку переименования для разных файлов (просто переименовать имя файла) или просто сделать так, чтобы скрипт воздействовал на все файлы * .xlsx в существующей папке. ,

  2. Создайте новую папку, где находятся эти файлы, и назовите ее «fooFolder-2011-07-26» (вчерашняя дата).

  3. Переместить эти переименованные файлы в эту папку.

У меня ограниченный опыт работы с PowerShell. Это в моем списке языков для изучения ..

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Вот, пожалуйста. Его можно было бы значительно сократить, используя псевдонимы, конвейеры и еще много чего, но, поскольку вы все еще не знакомы с Powershell, я решил написать для вашего чтения более процедурный стиль:

function MoveFilesAndRenameWithDate([string]$folderPrefix, [string]$filePattern) {
  $files = Get-ChildItem .\* -include $filePattern
  ForEach ($file in $files) {
    $yesterDate = $file.CreationTime.AddDays(-1).ToString('yyyy-MM-dd')
    $newSubFolderName = '{0}-{1}' -f $folderPrefix,$yesterDate
    if (!(Test-Path $newSubFolderName)) {
      mkdir $newSubFolderName
    }
    $newFileName = '{0}-{1}{2}' -f $file.BaseName,$yesterDate,$file.Extension
    Move-Item $file (Join-Path $newSubFolderName $newFileName)
  }
}

Вы вставили бы вышеупомянутое в ваш сеанс Powershell (поместите его в свой профиль). Затем вы вызываете функцию следующим образом:

MoveFilesAndRenameWithDate 'fooFolder' '*.xslx'

Я склонен использовать больше псевдонимов и конвейеров, чем указанная выше функция. Первая версия, которую я написал, была такой, а затем я отделил ее части, чтобы сделать ее более понятной для новичка в Powershell:

function MoveFilesAndRenameWithDate([string]$folderPrefix, [string]$filePattern) {
  gci .\* -include $filePattern |
    % { $date = $_.CreationTime.AddDays(-1).ToString('yyyy-MM-dd')
        mkdir "$folderPrefix-$date" 2>$null
        mv $_ (join-path $newSubFolderName ('{0}-{1}{2}' -f $_.BaseName,$date,$_.Extension))}
}

Редактировать : Изменены обе функции для создания устаревшей папки для файлов, соответствующих этой дате. Я подумал о создании временного каталога и получении единственной даты из файлов, перемещенных в него, и, наконец, переименовании каталога после цикла. Однако если пропустить один день и обработать файлы в течение 2 (или более) дней, все равно будет папка для каждого дня, что более согласованно.

0 голосов
/ 28 июля 2011

хорошо, я сделал это

 function NameOfFunction([string]$folderpath)
 {
    foreach ($filepath in [System.IO.Directory]::GetFiles($folderpath))
    {
        $file = New-Object System.IO.FileInfo($filepath);
        $date = $file.CreationTime.AddDays(-1).ToString('yyyy-MM-dd');
        if (![System.IO.Directory]::Exists("C:\\test\foo-$date"))
        {
            [System.IO.Directory]::CreateDirectory("$folderpath\foo-$date");
        }
        $filename = $file.Name.Remove($file.Name.LastIndexOf('.'));
        $fileext = $file.Name.SubString($file.Name.LastIndexOf('.'));
        $targetpath = "$folderpath\foo-$date" + '\' + $filename + '-' + $date + $fileext;
        [System.IO.File]::Move($filepath, $targetpath);
    }
 }

Пояснение: Сначала получите все файлы в корневой папке. В каждой папке мы создаем FileInfo-Object и получаем CreationTime -1 Day. Затем мы проверяем, существует ли каталог, который должен быть создан, и создаем его, если false. Затем мы получаем имя файла и расширение. В конце мы перемещаем файлы в новый каталог под новым именем файла.

Надеюсь, что вам поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...