powershell - 如何使用PowerShell在S3存储桶之间复制大于5GB的文件

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

如何使用PowerShell在S3存储桶之间复制大于5GB的文件?

有几个使用PowerShell在AWS S3存储桶之间复制文件的示例,但他们使用了limited to files less than 5GB的Copy-S3Object命令。

最佳答案

您必须首先download并安装AWS Tools for Windows PowerShell

这基于AWS站点上的C#example

$AWSCredentials = Get-AWSCredentials -ProfileName YourProfileName  # use Get-AWSCredentials -ListProfiles

$sourceBucket    = " "  #source Bucket 
$targetBucket    = " " #target Bucket 
$sourceObjectKey = " " #source filename
$targetObjectKey = " " #target filename
$region="USEast1"  #region
$copyResponses = @()

$s3Config = New-Object Amazon.S3.AmazonS3Config
$s3Config.RegionEndpoint = [Amazon.RegionEndpoint]::$region


$s3client = New-Object Amazon.S3.AmazonS3Client($AWSCredentials,$s3Config) 

$initiateRequest = New-Object Amazon.S3.Model.InitiateMultipartUploadRequest
$initiateRequest.BucketName = $targetBucket 
$initiateRequest.Key = $targetObjectKey

$initResponse = $s3client.InitiateMultipartUpload($initiateRequest)
$uploadId = $initResponse.UploadId
$uploadId

$metadataRequest = New-Object Amazon.S3.Model.GetObjectMetadataRequest
$metadataRequest.BucketName = $sourceBucket
$metadataRequest.Key = $sourceObjectKey

$metadataResponse = New-Object Amazon.S3.Model.GetObjectMetadataResponse
$metadataResponse = $s3client.GetObjectMetadata($metadataRequest)
$objectSize = $metadataResponse.ContentLength; # in bytes
$objectSize

$partSize = 1GB
$objectSize / $partSize

$bytePosition = 0
for ($i = 1; $bytePosition -lt $objectSize; $i++)
{
    $copyRequest = New-Object Amazon.S3.Model.CopyPartRequest  
    $copyRequest.DestinationBucket = $targetBucket
    $copyRequest.DestinationKey = $targetObjectKey
    $copyRequest.SourceBucket = $sourceBucket
    $copyRequest.SourceKey = $sourceObjectKey
    $copyRequest.UploadId = $uploadId
    $copyRequest.FirstByte = $bytePosition
    $copyRequest.LastByte = if ($bytePosition + $partSize - 1 -ge $objectSize) { $objectSize - 1} else {$bytePosition + $partSize - 1}
    $copyRequest.PartNumber = $i

    $copyResponses += $s3Client.CopyPart($copyRequest)
    $bytePosition += $partSize                     
}

$completeRequest  =  New-Object Amazon.S3.Model.CompleteMultipartUploadRequest
$completeRequest.BucketName = $targetBucket
$completeRequest.Key = $targetObjectKey
$completeRequest.UploadId = $uploadId
$completeRequest.AddPartETags($copyResponses)

$completeUploadResponse =$s3Client.CompleteMultipartUpload($completeRequest)

关于powershell - 如何使用PowerShell在S3存储桶之间复制大于5GB的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32635462/

相关文章:

powershell - 从 LastLogonTimestamp 中提取日期

powershell - 如何在 powershell 中使用 GetWindowText API 函数?

ruby - 如何查看移动设备是否已注册

java - AWS S3 Java SDK : RequestClientOptions. setReadLimit

html - 如何将 React 应用程序合并到具有现有 HTML 结构的现有网站中

regex - 正则表达式从最接近末尾的字符串中获取子字符串

powershell - 使用 ScriptBlock 和 ArgumentList 调用时,Invoke-Command 仅返回单个对象

amazon-web-services - Tensorboard 的 SageMaker 网址是什么?

amazon-web-services - Kubernetes:删除后,Replication Controller仍然存在

node.js - 为什么我的 S3 存储桶中的视频没有缓冲到 html 视频标签?