Jump to content
Sign in to follow this  
playaz

PS: Amazon S3 Bucket Script Anpassung

Recommended Posts

Hi,

 

 

folgende Anforderung: 

 

Ein Ordner mit hunderten von Files sollen zum Amazon S3 Bucket kopiert  werden. Das Script habe ich soweit fertig.

Die Files bestehen aus "Datum_Personalnummer_......" zb. "20181218_123456_FILENAME.CSV"

 

Jetzt soll aus dem Filenamen das Datum herausgelesen werden und automatisch ein Ordner angelegt werden im S3 Bucket genau so wie Personalnummer.

D.h. unter jedem Datum die jeweilige Personalnummer und in den Ordner soll dann die Datei abgelegt werden.

 

Also

20181218

----------123456

----------1255

----------13252

----------23456

 

20181219

----------123456

----------1255

----------13252

----------23456

 

 

 

Es werden auf einem Netzlaufwerk alle Files (hunderte) in einem Ordner abgelegt, die sollen dann auf den S3 Bucket transferiert werden in dieser Ordnerstruktur.

 

 

Ich bin kein großer Programmierer oder Skripter deshalb meine Frage an euch was ich an meinem Script anpassen muss um das zu bewerkstelligen. 

Es müsste lediglich aus dem Dateinamen das Datum und die Personalnummer herausgelesen werden und im Bucket dann der jeweilige Ordner erstellt werden.

 

Mein bisheriges Script das alle *.csv Files rüber kopiert funktioniert auch.

 

Vielen Dank im Vorraus :) 

 

$bucket = 'bucketname'
$source = 'C:\Scripts\AmazonS3\Upload'
$AKey   = 'xxxxxxxxxxxxxxxx'
$SKey   = 'xxxxxxxxxxxxxxxx'
$region = 'us-west-2'

Initialize-AWSDefaultConfiguration -AccessKey $AKey -SecretKey $SKey -Region $region
 
Set-Location $source
$files = Get-ChildItem '*.csv' | Select-Object -Property Name
try {
   if(Test-S3Bucket -BucketName $bucket) {
      foreach($file in $files) {
         if(!(Get-S3Object -BucketName $bucket -Key $file.Name)) { ## verify if exist
            Write-Host "Copying file : $file "
            Write-S3Object -BucketName $bucket -File $file.Name -Key "Folder1/$($file.Name)" -CannedACLName private
         } 
      }
   } Else {
      Write-Host "The bucket $bucket does not exist."
   }
} catch {
   Write-Host "Error uploading file $file"
}

 

Share this post


Link to post
Share on other sites

Moin,

 

dieser Skriptschnipsel teilt die Dateinamen eines Ordners beim Unterstrich als Trennzeichen auf.

foreach ($File in $Folder.GetEnumerator()) {
  $Name = $File.Name
  $Prefix = $Name.Split('_')[0]
  # hier passiert was  
}

Hinterher steht der Teil vor dem ersten Unterstrich in $Prefix. Da der zweite Teil bei dir die Personalnummer ist, kannst du den mit $Name.Split('_')[1] in eine Variable stecken. Eleganter wäre es natürlich, die Teile in ein Array zu schreiben, deren Elemente du dann in ähnlicher Form direkt ansprechen kannst, das erspart den mehrfachen Aufruf der Split-Methode (wobei das kaum ins Gewicht fällt).

 

Dann nimmst du die beiden Variablen, um die Ordner anzulegen, falls sie noch nicht existieren. Dort kopierst du dann die Datei hin.

 

Gruß, Nils

 

  • Like 1

Share this post


Link to post
Share on other sites

Hi Nils,

 

Vielen Dank. Ich bin absolut kein Scripter oder Programmierer, wüsste nicht wie ich das einbauen könnte das es funktioniert :lol3:.

Aber spuckt google was raus, danke auf jeden Fall für den Tip.

Share this post


Link to post
Share on other sites

Moin,

 

üblicherweise schreiben wir hier keine vollständigen Skripte. Wir helfen dir gern aufs Pferd, aber Reiten musst du selbst.

 

Da ich gerade Lust drauf hatte, hier ein Skriptschnippsel, der dir die Ordnerstruktur auf einer lokalen Platte erzeugt. Wie du das in S3 umsetzt, musst du selbst sehen. Das Kopieren musst du dann auch noch einbauen.

 

$FolderPath = 'C:\Quelle\Pfad'
$TargetPath = 'E:\Ziel\Pfad\'
$Folder = Get-ChildItem -Path $FolderPath -Filter *.gz
foreach ($File in $Folder.GetEnumerator()) {
  $Name = $File.Name
  $Parts = $Name.Split('_')
  if(!(Test-Path -Path ($TargetPath + $Parts[0]) )){
    New-Item -ItemType directory -Path ($TargetPath + $Parts[0])
  }
  if(!(Test-Path -Path ($TargetPath + $Parts[0] + '\' + $Parts[1]) )){
    New-Item -ItemType directory -Path ($TargetPath + $Parts[0] + '\' + $Parts[1])
  }
}

Gruß, Nils

 

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...