【问题标题】:Copying new files from newly created folders in my S3 bucket to my local machine using PowerShell使用 PowerShell 将新文件从 S3 存储桶中新创建的文件夹复制到本地计算机
【发布时间】:2018-10-05 18:07:13
【问题描述】:

我们有一个在服务器上运行的程序,它将 .xml 文件复制到我们的 S3 存储桶中。但它会根据日期创建文件夹。因此,创建了一年的文件夹,然后创建了月份的子文件夹,然后创建了当天的另一个子文件夹。例如:

S3://AppMyBucket/Documents/2018/Oct/05

所以它每天都按照当天创建一个文件夹,010203 等,并将 .xml 文件放入这些文件夹中。我必须创建一个每 15 分钟运行一次的 PowerShell 脚本,以将进入从我们的 S3 存储桶创建的最新文件夹中的新文件复制到我本地计算机上的文件夹中,然后调用另一个程序来处理这些文件。

我的问题是如何将在我们的 S3 存储桶 (S3://AppBucket/Documents/2018/Oct/05...) 中创建的新文件夹创建的新文件复制到我的本地 Windows 机器 (D:\DocFolder\),然后调用程序 (AIMParser.exe) 来处理这些 .xml文件?

请原谅我,因为我是 PowerShell 的初学者。

【问题讨论】:

  • 您想从今天的文件夹下载文件吗?还是您需要识别最新的文件夹? IE。当您的脚本运行时,最新的文件夹是否可能不是今天的文件夹?
  • 另外,你这里有三个问题,所以你真的应该分开发布它们。 1) 识别最新文件夹,2) 从 S3 文件夹下载新文件。 3) 调用程序。
  • 非常感谢 Reza 的回复!正在运行的应用程序将根据日期创建文件夹,所以是的,今天创建的文件夹将始终是最新的文件夹。所以我需要弄清楚如何扫描 S3 以查找放在最新文件夹中的文件。在这种情况下,该文件夹将是月份中的某一天。创建新月份后,它需要检测是否也创建了新的月份和日期文件夹。代码将需要扫描最近一个月和最近一天,并将应用程序放入其中的最新文件复制到我的本地计算机。
  • 本地方面呢?您是否保留D:\DocFolder 中的目录结构,例如D:\DocFolder\2018\Oct\05?还是文件直接转到D:\DocFolder? - 你如何识别新文件?您是否将所有文件都保存在本地,因此您只想下载本地尚未存在的文件?
  • 代码需要识别到达我们的 S3 存储桶 (s3://AppBucket/Documents/2018/Oct/08) 的新 .xml 文件,因此需要考虑年/月/日s3 存储桶 s3://AppBucket/Documents/ 下的目录结构将根据今天的日期发生变化。 .xml 文件需要直接复制到我本地机器上的 D:\DocFolder。将 .xml 文件复制到我的本地计算机 D:\DocFolder 后,另一个应用程序将处理它们并将它们放在其他位置,因此一旦被此应用程序处理,D:\DocFolder 中就不会有任何 .xml 文件。

标签: amazon-web-services powershell amazon-s3


【解决方案1】:

下面的例子:

  • 使用WinSCP .NET assembly 访问 S3 存储桶
  • 查找最近的年份(按字典顺序)
  • 查找一年中的最后一个月
  • 查找该月的最后一天(按字典顺序)
  • 查找当天最新的文件(按文件时间戳)
Add-Type -Path "WinSCPnet.dll"

$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::S3
    HostName = "s3.amazonaws.com"
    PortNumber = 443
    UserName = "access key id"
    Password = "secret access key"
}

Write-Host "Connecting..."
$session = New-Object WinSCP.Session
$session.SessionLogPath = "s3.log"
$session.Open($sessionOptions)

$remotePath = "/AppMyBucket/Documents";
$localPath = "D:\DocFolder"

$yearFolder =
    $session.ListDirectory($remotePath).Files |
        Where-Object { $_.IsDirectory } |
        Sort-Object -Descending |
        Select-Object -First 1
Write-Host "Latest year is $($yearFolder.Name)"

$yearPath = [WinSCP.RemotePath]::Combine($remotePath, $yearFolder.Name)

$monthFolder =
    $session.ListDirectory($yearPath).Files |
        Where-Object { $_.IsDirectory } |
        Sort-Object -Descending -Property @{ Expression = {
            Get-Date -Date "$($_.Name) 1 $($yearFolder.Name)" -Format "MM" } } |
        Select-Object -First 1

Write-Host "Latest month is $($monthFolder.Name)"

$monthPath = [WinSCP.RemotePath]::Combine($yearPath, $monthFolder.Name)

$dayFolder =
    $session.ListDirectory($monthPath).Files |
        Where-Object { $_.IsDirectory } |
        Sort-Object -Descending |
        Select-Object -First 1

Write-Host "Latest day is $($dayFolder.Name)"

$dayPath = [WinSCP.RemotePath]::Combine($monthPath, $dayFolder.Name)

$latest = 
    $session.ListDirectory($dayPath).Files |
        Where-Object { -Not $_.IsDirectory } |
        Sort-Object LastWriteTime -Descending |
        Select-Object -First 1

Write-Host "Latest file is $($latest.Name), downloading..."

$session.GetFiles($latest.FullName, (Join-Path $localPath "*")).Check()

Write-Host "Done"
$session.Dispose()

(我是 WinSCP 的作者)

【讨论】:

  • 嘿马丁。太感谢了!!!我做了一些更改并运行了脚本。我替换了 $remotePath = "adpro-chc-prod-rcm/Documents/UAT/" 但这是输出:最近一年是跟踪失败。 ....最新月份是 2018 最新日期是 10 月 最新文件是 ,正在下载...
  • 看起来正确的$remotePath 应该类似于/adpro-chc-prod-rcm/Documents/UAT/something - 在UAT 中似乎有tracking-failure 和类似的子文件夹,而不是年份文件夹。
猜你喜欢
  • 2020-12-10
  • 1970-01-01
  • 2023-03-22
  • 2017-11-23
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多