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

Win10 Pro下PowerShell脚本执行AWS S3同步的问题排查

问题描述

在Win10 Pro系统中监控C:\source文件夹,目标是文件创建时同步到AWS S3备份桶。原脚本可正常记录操作日志,但添加Created事件的处理逻辑后,脚本完全失效,无日志输出也无S3同步操作。单独在CMD执行aws s3 sync .\\source s3://backuptesttdxckf可以正常运行。

错误原因分析
  1. 工作目录不匹配:aws s3 sync使用的相对路径.\\source,但PowerShell事件触发器的工作目录并非C:\source,导致AWS CLI无法定位到目标文件夹。
  2. 事件逻辑阻塞:同一个动作块被注册到所有事件类型,Created事件触发时,同步命令的执行可能阻塞事件处理线程,导致后续所有事件无法响应。
  3. 全局变量上下文冲突:事件动作块运行在独立的PowerShell运行空间中,直接修改$global:files可能无法正确同步到主循环,引发逻辑异常。
解决方案

1. 修正AWS同步路径

使用绝对路径替代相对路径,确保AWS CLI能准确定位源文件夹,且无需通过cmd.exe /c调用:

aws s3 sync "C:\source" s3://backuptesttdxckf

2. 拆分事件处理逻辑

为Created事件单独编写动作块,避免与其他事件逻辑互相干扰:

# 创建文件专用处理逻辑
$createdAction = {
    $path = $Event.SourceEventArgs.FullPath
    $changeType = $Event.SourceEventArgs.ChangeType
    $logline = "$(Get-Date -f o), $changeType, $path"
    Add-content "C:\Users\xxxx\OneDrive\Documentos\log.txt" -value $logline
    Write-Host $logline

    try {
        aws s3 sync "C:\source" s3://backuptesttdxckf
        Add-content "C:\Users\xxxx\OneDrive\Documentos\log.txt" -value "Synced to S3! $path"
    } catch {
        Add-content "C:\Users\xxxx\OneDrive\Documentos\log.txt" -value "S3 Sync Error: $_"
        Write-Host -ForegroundColor Red "S3 Sync Error: $_"
    }
    [void]$global:files.Add($path)
}

# 其他事件通用处理逻辑
$defaultAction = {
    $path = $Event.SourceEventArgs.FullPath
    $changeType = $Event.SourceEventArgs.ChangeType
    $logline = "$(Get-Date -f o), $changeType, $path"
    Add-content "C:\Users\xxxx\OneDrive\Documentos\log.txt" -value $logline
    Write-Host $logline

    if($changeType -eq "Renamed" -and $path.Split(".")[-1] -ne "crdownload") {
        Write-Host -ForegroundColor Green "Found the file we need! $path"
        Add-content "C:\Users\xxxx\OneDrive\Documentos\log.txt" -value "Found the file we need! $path"
        [void]$global:files.Add($path)
    }
}

# 分别注册事件
Register-ObjectEvent $watcher "Created" -Action $createdAction
Register-ObjectEvent $watcher "Changed" -Action $defaultAction
Register-ObjectEvent $watcher "Deleted" -Action $defaultAction
Register-ObjectEvent $watcher "Renamed" -Action $defaultAction

3. 优化全局变量(可选)

使用线程安全的集合替代普通数组,避免多线程环境下的变量冲突:

# 初始化线程安全集合
$global:files = New-Object System.Collections.ArrayList

# 添加元素时使用Add方法,[void]避免返回索引值
[void]$global:files.Add($path)

4. 调试辅助(可选)

在动作块中添加错误捕获,输出详细错误信息到日志,便于排查问题:

try {
    # 执行同步或其他操作
} catch {
    Add-content "C:\Users\xxxx\OneDrive\Documentos\log.txt" -value "Error: $_"
    Write-Host -ForegroundColor Red "Error: $_"
}

内容的提问来源于stack exchange,提问作者IgorAlves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:27:43