Powershell: создание структуры папок на основе месяца и года и соответственно копирование файла - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть папка, содержащая множество файлов, созданных за эти годы. Давайте назовем это папкой A, в папке A у меня есть файлы, созданные в 2012,2013,2014 и т. Д., Файлы будут постоянно создаваться в этой папке. Под папкой А нет структуры, только куча файлов.

TASK1:

Теперь я должен сделать копию этих файлов на основе месяца и года, у меня есть папка B, в этой папке B, сначала я хотел бы иметь уровень по годам, затем под каждым годом у меня будут папки к месяцу, поэтому все файлы из папки A будут скопированы в каждое место в папке B на основе даты создания .

--B
---2013
--------Jan
--------Feb
--------Mar
---2014
--------Jan
--------Feb
--------Mar
.......

Задание 2:

Этот сценарий будет планироваться 3 раза в день, при каждом запуске он должен сравнивать " дату последнего изменения " между источником и местом назначения, если " дата последнего изменения msgstr "на источнике новее места назначения, затем скопируйте измененный файл в место назначения с" оригинальным именем + дата изменения "в качестве имени нового файла. Пропустите, если файлы остались нетронутыми.

Ответы [ 4 ]

1 голос
/ 22 апреля 2019

Самый эффективный метод - IMO

  • для создания вычисляемого свойства из года и месяца CreationDate
  • Группировка по этому свойству
  • создание целевой папки, если она не существует
  • переместить файлы этой группы

## Q:\Test\2019\04\22\SO_55798207.ps1

$Source = "X:\FolderA"
$Target = "Y:\FolderB"

Push-Location $Source

Get-ChildItem $Source -File |
  Select-Object *,@{n='YearMonth';e={$_.CreationTime.ToString('yyyy\\MMM')}} |
    Group-Object YearMonth | ForEach-Object {
      $NewFolder = Join-Path $Target $_.Name
      If (!(Test-Path $NewFolder)){New-Item $NewFolder -ItemType Directory|Out-Null}
      $_.Group | Copy-Item -Destination $NewFolder
    }
Pop-Location
0 голосов
/ 23 апреля 2019

Другой способ - использовать BitsTransfer.

$dirA = "C:\Test\A"
$dirB = "C:\Test\B"

$params = Get-ChildItem $dirA -File | foreach {
    $destFile = [IO.FileInfo]("{0}\{1:yyyy}\{1:MMM}\{2}_{3:yyyyMMddhhmmss}{4}" -f $dirB,$_.CreationTime,$_.BaseName,$_.LastWriteTime,$_.Extension)
    if($destFile.Exists) { return }
    $destFile.Directory.Create()
    @{ Src = $_.FullName; Dest = $destFile.FullName }
}

if(!$params) { return }
Start-BitsTransfer -Source $params.Src -Destination $params.Dest -DisplayName "Backup"
0 голосов
/ 22 апреля 2019

Хорошо, это было переработано.Это самый эффективный способ сделать это с этой технологией.

$indexFilePath = "C:\Folder B\FileUpdateTracker.Json"

if ((Test-Path -Path $indexFilePath) -eq $false)
{
    [psobject]@{
                LastUpdate = [datetime]::MinValue.Date;
               } | ConvertTo-Json | Out-File -FilePath $indexFilePath -NoClobber
}

$oldFileIndex = Get-Content -Path $indexFilePath | ConvertFrom-Json

$testFiles = @(Get-ChildItem -Path "C:\Folder A" | Where { $_.LastWriteTime.Date -ge $oldFileIndex.LastUpdate })


if ($testFiles.Count -eq 0)
{
    return
}

$fileIndex = [psobject]@{
                            LastUpdate = (Get-Date).Date;
                        }

foreach ($file in $testFiles)
{
    $year = $file.CreationTime.Year
    $month = $file.CreationTime.ToString("MMM")

    $archivePath = "C:\Folder B\$year\$month"

    mkdir -Path $archivePath -ErrorAction SilentlyContinue

    $copiedFileName = $null

    if ((Test-Path "$archivePath\$($file.Name)") -and $file.LastWriteTime.Date -ge $oldFileIndex.LastUpdate)
    {
        $copiedFileName = "$archivePath\$($file.Name.Replace($file.Extension, "_$($file.LastWriteTime.ToString("MM-dd-yy_hh-mm"))$($file.Extension)"))"
    }else{
        $copiedFileName = "$archivePath\$($file.Name)"
    }

    Copy-Item -Path ($file.FullName) -Destination $copiedFileName
}


$fileIndex | ConvertTo-Json | Out-File -FilePath $indexFilePath -Force
0 голосов
/ 22 апреля 2019

Это должно удовлетворить ваш запрос:

$Files = Get-ChildItem -Path "C:\FolderA"

Foreach ($File in $Files) {

   $File | Copy-Item -Destination "C:\FolderB\$( $File.LastWriteTime.Year )\$( $File.LastWriteTime.ToString("MMM") )"

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