4

以下脚本从文件夹结构复制所有文件,然后将它们粘贴到 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
    }
}
4

2 回答 2

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
}
于 2015-05-29T10:46:42.607 回答
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 脚本 - 如果我的风格和方法有误,请原谅我。

于 2015-12-03T05:45:42.410 回答