PowerShell脚本上传S3 Bucket报错:找不到Amazon.AWSClientFactory类型
解决PowerShell中
Amazon.AWSClientFactory类型未找到的问题 这个错误的核心原因是你参考的教程使用了旧版本的AWS SDK for .NET/AWS PowerShell模块,而Amazon.AWSClientFactory类在新版AWS工具中已经被弃用并移除了。下面是具体的解决步骤和优化方案:
1. 升级/安装正确的AWS PowerShell模块
首先要替换掉老旧的AWSPowerShell模块,安装最新的AWS.Tools系列模块(更轻量化、维护更活跃):
- 以管理员身份打开PowerShell,先卸载旧模块(如果已安装):
Uninstall-Module -Name AWSPowerShell -Force -AllVersions - 安装针对S3的专用模块:
Install-Module -Name AWS.Tools.S3 -Force -AllowClobber
2. 修改客户端初始化代码
把原脚本中创建S3客户端的旧代码:
$client=[Amazon.AWSClientFactory]::CreateAmazonS3Client($accessKeyID,$secretAccessKey,$config)
替换成新版SDK支持的直接实例化方式,二选一即可:
# 方式1:PowerShell风格写法 $client = New-Object Amazon.S3.AmazonS3Client($accessKeyID, $secretAccessKey, $config) # 方式2:更简洁的.NET构造函数写法(PowerShell 5.1+支持) $client = [Amazon.S3.AmazonS3Client]::new($accessKeyID, $secretAccessKey, $config)
3. 优化脚本的其他部分(可选但推荐)
原脚本依赖Scripting.FileSystemObject这个COM对象,稳定性和兼容性不如PowerShell原生命令,推荐替换成Get-ChildItem实现递归遍历:
function RecurseFolders([string]$path) { # 获取当前路径下的所有子文件夹 $subFolders = Get-ChildItem -Path $path -Directory foreach ($folder in $subFolders) { $thisFolder = $folder.FullName # 转换本地路径为S3兼容格式 $s3Path = $thisFolder.Substring(2) -replace "\\", "/" $s3Path = "/$s3Folder/$s3Path" # 上传文件夹到S3,指定配置确保区域正确 Write-S3Object -BucketName $s3Bucket -Folder $thisFolder -KeyPrefix $s3Path -ClientConfig $config } # 递归处理子文件夹 foreach ($folder in $subFolders) { RecurseFolders($folder.FullName) } }
同时上传根目录的代码也建议加上-ClientConfig参数,避免区域配置失效:
$s3Path = "/$s3Folder/$sourceFolder" Write-S3Object -BucketName $s3Bucket -Folder $sourcePath -KeyPrefix $s3Path -ClientConfig $config
完整修改后的脚本示例
# Constants $sourceDrive = "C:\" $sourceFolder = "Users\Administrator\AppData\Roaming\folder" $sourcePath = Join-Path -Path $sourceDrive -ChildPath $sourceFolder # 用Join-Path拼接路径更安全 $s3Bucket = "bucket" $s3Folder = "Archive" # Constants — Amazon S3 Credentials $accessKeyID="KEY" $secretAccessKey="Secret" # Constants — Amazon S3 Configuration $config=New-Object Amazon.S3.AmazonS3Config $config.RegionEndpoint=[Amazon.RegionEndpoint]::ap-southeast-2 $config.ServiceURL = "https://s3-ap-southeast-2.amazonaws.com/" # Instantiate the AmazonS3Client object (新版写法) $client = [Amazon.S3.AmazonS3Client]::new($accessKeyID, $secretAccessKey, $config) # FUNCTION — Iterate through subfolders and upload files to S3 function RecurseFolders([string]$path) { $subFolders = Get-ChildItem -Path $path -Directory foreach ($folder in $subFolders) { $thisFolder = $folder.FullName # 转换路径为S3兼容格式 $s3Path = $thisFolder.Substring(2) -replace "\\", "/" $s3Path = "/$s3Folder/$s3Path" # 上传目录到S3 Write-S3Object -BucketName $s3Bucket -Folder $thisFolder -KeyPrefix $s3Path -ClientConfig $config } # 递归处理子文件夹 foreach ($folder in $subFolders) { RecurseFolders($folder.FullName) } } # Upload root directory files to S3 $s3Path = "/$s3Folder/$sourceFolder" Write-S3Object -BucketName $s3Bucket -Folder $sourcePath -KeyPrefix $s3Path -ClientConfig $config # Upload subdirectories to S3 RecurseFolders($sourcePath)
额外提示
- 尽量不要在脚本里硬编码密钥,推荐使用AWS凭证文件(
~/.aws/credentials)或者IAM角色(如果在EC2/ECS等AWS服务上运行),安全性更高。 - 如果你的PowerShell版本低于5.1,用
New-Object的方式实例化客户端即可。
内容的提问来源于stack exchange,提问作者user9683977
相关产品推荐
相关产品推荐

