1

我将 S3 存储桶的内容复制到本地目录,但是我从 powershell 得到错误输出。

Copy-S3Object : 请求的范围不可满足

它指向这个命令:

Copy-S3Object -BucketName $bucket -Key $object.Key -LocalFile $localFilePath -Region $region

为什么我会收到此错误?请注意,需要复制的所需文件确实会在本地复制。

4

3 回答 3

3

我不能说为什么您会从 S3 返回该错误,但我可以告诉您,如果您要复制多个对象,您可能想要使用 -LocalFolder 参数,而不是 -LocalFile。-LocalFolder 会将前缀保留为子路径。

从 S3 下载一个或多个对象时,Read-S3Object cmdlet 的工作方式与 Copy-S3Object 相同,但使用 -KeyPrefix 指定对象共享的公共前缀,并使用 -Folder 指示应下载到的文件夹。

这也提醒我,我需要检查为什么我们在 Copy- 上使用 -LocalFolder,在 Read- 上使用 -Folder,尽管我怀疑也可以使用别名来使它们保持一致。

高温高压

(编辑):我今天早上花了一些时间查看 cmdlet 代码,但在我看来,cmdlet 在多对象下载时不会按原样工作,即使它具有 -LocalFolder 参数。如果您要下载单个对象,则使用 -Key/-LocalFile 是正确的参数组合。如果传递了 -LocalFolder,则 cmdlet 在内部设置为执行单个文件下载,而不是将 -Key 视为一组对象的公共键前缀。所以,我认为我们这里有一个我正在调查的错误。

同时,我会使用 Read-S3Object 进行下载。它支持单(-Key)或多对象下载(-KeyPrefix)模式。https://docs.aws.amazon.com/powershell/latest/reference/index.html?page=Read-S3Object.html&tocid=Read-S3Object

于 2017-05-20T01:30:51.013 回答
2

这似乎发生在不包含文件的文件夹中,因为 copy 想要复制文件。我接受了这个错误并将其困住。

catch  [Amazon.S3.AmazonS3Exception]
{

  # get error record
  [Management.Automation.ErrorRecord]$e = $_

  # retrieve information about runtime error
  $info = [PSCustomObject]@{
    Exception = $e.Exception.Message
    Reason    = $e.CategoryInfo.Reason
    Target    = $e.CategoryInfo.TargetName
    Script    = $e.InvocationInfo.ScriptName
    Line      = $e.InvocationInfo.ScriptLineNumber
    Column    = $e.InvocationInfo.OffsetInLine
    ErrorCode = $e.Exception.ErrorCode
  }
  if ($info.ErrorCode="InvalidRange") { #do nothing 
  } Else {
  # output information. Post-process collected info, and log info (optional)
  write-host $info -ForegroundColor Red}
}

  }
于 2019-05-30T17:53:13.390 回答
0

当我尝试下载其中包含多个点的文件时,这发生在我身上。简化文件名,修复错误。

File name that gave me error: myfile-18.10.exe
File name that worked: myfile-1810.exe
于 2022-01-05T20:34:23.190 回答