如何识别已上载到S3的本地文件,此后没有更改?

时间:2015-05-29 09:35:30

标签: powershell amazon-web-services amazon-s3 aws-powershell

以下脚本从文件夹结构中复制所有文件,然后将其粘贴到S3存储桶。但是我希望它能够跳过自上次上传以来没有更改过的文件,以避免重复上传。有谁知道如何获得if文件存在检查或最后修改?

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

2 个答案:

答案 0 :(得分:3)

对于一个非常基本的“文件是否存在?”您可以将Get-S3Object与相同位置一起使用,并在尝试上传之前测试每个文件。

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

将更改日期与上次上传进行比较稍微复杂一些,但您可以使用更类似的测试:

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

答案 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脚本 - 如果我的风格和方法有误,请原谅我。