2

Нижеприведенный скрипт копирует все файлы из структуры папок, затем вставляет их в ведро S3. Однако я хочу, чтобы он мог пропускать файлы, которые не были изменены со времени последней загрузки, чтобы избежать дублирования загрузки. Кто-нибудь знает, как я могу получить, если файл существует, проверка или последнее изменение?Как я могу определить локальные файлы, которые уже были загружены на S3, и с тех пор не изменились?

Import-Module "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\AWSPowerShell.psd1" 
$bucket="bucketname" 
$source="e:\dfs\*" 
$outputpath="C:\temp\log.txt" 
$AKey="xxxx" 
$SKey="xxxx" 

Set-AWSCredentials -AccessKey $AKey -SecretKey $SKey -StoreAs For_Move 
Initialize-AWSDefaults -ProfileName For_Move -Region eu-west-1 

Start-Transcript -path $outputpath -Force 
foreach ($i in Get-ChildItem $source -include *.* -recurse) 
{ 
    if ($i.CreationTime -lt ($(Get-Date).AddDays(-0))) 
    { 
     $fileName = (Get-ChildItem $i).Name 
     $parentFolderName = Split-Path $i -Parent 

     Write-S3Object -BucketName $bucket -Key dfs/$parentFolderName/$filename -File $i 
    } 
} 
+1

Почему бы не использовать функцию синхронизации? http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html –

+0

Я рассмотрю этот вариант. Спасибо –

+0

А, мне было интересно, почему не было параметра «noclobber» (или подобного). Что объясняет его! –

ответ

2

Для очень простого "существует ли файл?" вы можете использовать Get-S3Object с тем же местоположением и протестировать каждый файл, прежде чем пытаться его загрузить.

if (!(Get-S3Object -BucketName $bucket -Key dfs/$parentFolderName/$filename)) { 
    Write-S3Object -BucketName $bucket -Key dfs/$parentFolderName/$filename -File $i 
} 

Сравнивая Changed дату последней загрузки немного сложнее, но вы можете использовать тест больше как:

$localModified = (Get-ItemProperty -Path $fileName).LastWriteTime 
$s3Modified = (Get-S3Object -BucketName $bucket -Key $file -Region us-east-1).LastModified | Get-Date 

if ($s3Modified -lt $localModified) { 
    Write-S3Object -BucketName $bucket -Key dfs/$parentFolderName/$filename -File $i 
} 
+0

Спасибо! Проблема I теперь заключается в том, что объекты, загруженные на S3, меняют дату, поэтому их сравнение не выполняется. Возможно, S3 не лучшее решение для резервного копирования. Считается, что может помечать метаданные объекта S3 меткой времени. Слишком сложно, хотя –

+1

Когда вы говорите «измените свою дату», что вы имеете в виду? Даже если дата загрузки выше, чем последнее местное время записи, это все еще указывает на то, что ее нужно снова загружать, верно? –

1

Собираем их вместе я получил следующее:

Import-Module "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\AWSPowerShell.psd1" 
$bucket="<my bucket name>" 
$source="C:\dev\project\*" 
$outputpath="C:\dev\log.txt" 
$AKey="<key>" 
$SKey="<secret>" 
$region="<my AWS region>" 

Set-AWSCredentials -AccessKey $AKey -SecretKey $SKey -StoreAs For_Move 
Initialize-AWSDefaults -ProfileName For_Move -Region $region 

Start-Transcript -path $outputpath -Force 
foreach ($i in Get-ChildItem $source -include *.* -recurse) 
{ 
    if ($i.CreationTime -lt ($(Get-Date).AddDays(-0))) 
    { 
     $fileName = (Get-ChildItem $i).Name 
     $parentFolderName = Split-Path $i -Parent 
     $key = "$i" 

     $localModified = (Get-ItemProperty -Path $i).LastWriteTime 
     $remoteObject = Get-S3Object -BucketName $bucket -Key $key -Region $region 
     if($remoteObject -eq $null) { 
      Write-S3Object -BucketName $bucket -Key $key -File $i 
      "Added new file $i" 
     } else { 

      $s3Modified = $remoteObject.LastModified | Get-Date 

      if ($s3Modified -lt $localModified) { 
       Write-S3Object -BucketName $bucket -Key $key -File $i 
       "Updated $i" 
      } 
     } 
    } 
} 

Примечание: это первый сценарий Powershell, который я когда-либо писал - так простите меня, если у меня есть стиль и подход неправильный.