You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:56:04