使用powershell 7 foreach-object -parallel和AWS S3模块下载S3文件夹内容时出错



我有以下基本的AWS powershell脚本下载S3桶文件夹的所有内容。

Get-S3Object -BucketName $s3BucketName -keyPrefix $keyPrefix | Read-S3Object -Folder "C:tempEvents"

不幸的是,它运行太慢,因为文件夹包含数百个小文件,我需要并行下载。

我尝试使用以下脚本使用foreach-object -parallel

$S3object = Get-S3Object -BucketName $s3BucketName -keyPrefix $keyPrefix
$S3object | foreach-object -parallel { Read-S3Object -Key $_ -Folder "C:tempEvents" }

但是得到以下错误

[Error] Error:参数集不能使用指定的命名参数解析。不能同时使用发出的一个或多个参数,或者提供的参数数量不足。异常:Type: System.Management.Automation.ParameterBindingExceptionMessage:不能使用指定的命名参数来解析参数集。不能同时使用发出的一个或多个参数,或者提供的参数数量不足。ErrorId: ambiguouparametersetline: 1Offset: 2CommandInvocation:MyCommand: Read-S3ObjectBoundParameters:Comparer: System. comer: System. comerOrdinalIgnoreCaseComparerCount: 2Keys:Length: 3Length: 6Values:Length: 24Length: 25SyncRoot:Comparer: System.序号:OrdinalIgnoreCaseComparerCount: 2Keys:Length: 3Length: 6Values:Length: 24Length: 25SyncRoot:Comparer: System.序号:OrdinalIgnoreCaseComparerCount: 2Keys:Length: 3Length: 6Values:Length: 24Length: 25SyncRoot:Comparer: System.序号:OrdinalIgnoreCaseComparerCount: 2Keys:Length: 3Length: 6Values:Length: 24Length: 25SyncRoot:Comparer: System.序号:OrdinalIgnoreCaseComparerCount: 2Keys:Length: 3Length: 6Values:Length: 24Length: 25SyncRoot:Comparer: System.序号:OrdinalIgnoreCaseComparerCount: 2Keys:Length: 3Length: 6Values:Length: 24Length: 25SyncRoot:Comparer: System.序号:OrdinalIgnoreCaseComparerCount: 2Keys:…Values:…SyncRoot:…ScriptLineNumber: 1OffsetInLine: 2HistoryId: 1Line: Read-S3Object -Key $_ -Folder "C:tempEvents"PositionMessage: At line:1 char:2+ Read-S3Object -Key $_ -Folder "C:tempEvents"+

当我写host $S3object的内容时,我得到这个:

信息:Amazon.S3.Model。S3Object Amazon.S3.Model。S3Object Amazon.S3.Model。S3Object Amazon.S3.Model.S3Object

我做错了什么?我是否应该使用另一种方法,如工作,如果是,如何使用?

感谢

在您的-Parallel脚本块中,通过管道提供$_作为输入,类似于您的第一个命令,没有并行性:

$S3object | 
ForEach-Object -Parallel { $_ | Read-S3Object -Folder "C:tempEvents" }

或者,根据文档判断,您可以使用-S3Object而不是-Key

正如@mklement0所说,您可以使用$_和它的任何属性($_. name)来操作ForEach-Object内部管道的集合元素。

但是要使用ForEach-Object之外的其他变量,您需要像这样使用变量:$using:variable.

例如:

$S3object = Get-S3Object -BucketName $s3BucketName -keyPrefix $keyPrefix
$S3object | foreach-object -parallel {
Write-output('KeyPrefix used : ' + $using:keyPrefix)
Read-S3Object -Key $_ -Folder "C:tempEvents" 
} -ThrottleLimit 4