我有以下基本的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