2016-12-22 5 views
2

Kann jemand jede Datei in einem Verzeichnis in Data-Lake-Speicher und Unterverzeichnisse auflisten? anscheinend die -recursive Anweisung nicht funktioniert, wie es in einer normalen Umgebung tutPowershell -recursive in Azure Data Lake Store

Ich brauche dieses Skript in Azure Daten See Store laufen (was richtig in meinem Computer läuft)

$Quarentine = "C:\PSTest\QUARENTINE" 

$validate = "C:\PSTest\Files" 

get-childitem $validate -rec -af | Where-Object {$_.FullName -notmatch "^C:\\PSTest\\Files\\(.+\\)*(XX.+)\.(.+)$"} | 
move-item -destination {"C:\PSTest\QUARENTINE\"+ $_.BaseName +("{0:yyyyMMddHHmmss}" -f (get-date)) + $_.Extension} 

ich mit der arbeite Befehl Get-AzureRmDataLakeStoreChildItem wo scheinbar -recursive nicht unterstützt wird.

Kann mir bitte jemand helfen?

Dank

Antwort

1

Hier ist eine rekursive Art und Weise es (Einschränkung: es nicht gut skalierbar, da sie einen API-Aufruf für jedes Unterverzeichnis macht und nicht parallelisiert ist, und weil es alle Dateien in dem Speicher speichert) zu tun .

function Get-DataLakeStoreChildItemRecursive ([hashtable] $Params) { 
    $AllFiles = New-Object Collections.Generic.List[Microsoft.Azure.Commands.DataLakeStore.Models.DataLakeStoreItem]; 
    recurseDataLakeStoreChildItem -AllFiles $AllFiles -Params $Params 
    $AllFiles 
} 

function recurseDataLakeStoreChildItem ([System.Collections.ICollection] $AllFiles, [hashtable] $Params) { 
    $ChildItems = Get-AzureRmDataLakeStoreChildItem @Params; 
    $Path = $Params["Path"]; 
    foreach ($ChildItem in $ChildItems) { 
     switch ($ChildItem.Type) { 
      "FILE" { 
       $AllFiles.Add($ChildItem); 
      } 
      "DIRECTORY" { 
       $Params.Remove("Path"); 
       $Params.Add("Path", $Path + "/" + $ChildItem.Name); 
       recurseDataLakeStoreChildItem -AllFiles $AllFiles -Params $Params; 
      } 
     } 
    } 
} 

Get-DataLakeStoreChildItemRecursive -Params @{ 'Path' = '/Samples'; 'Account' = 'youradlsaccount' } 
0

nahm ich einen anderen Ansatz, aber ja die Antwort war meine eigene rekursive Funktion zu tun

function Get-DataLakeStoreChildItemRecursive ([string]$path, [string]$account, [string]$quarantine) { 

    $dirs = Get-AzureRmDataLakeStoreChildItem -Account $account -Path $path 

    foreach ($dir in $dirs) { 
     switch ($dir.Type) { 
      "FILE" { 
       if(($path + $dir.Name) -match "^/adls-dev/raw/amp/(.+/)*(amp.+)\.(.+)$") { 
       } 
       else { 
        $to = $quarantine + ("{0:yyyyMMddHHmmss}-" -f (get-date)) + $dir.Name 
        Move-AzureRmDataLakeStoreItem -AccountName $account -Path ($path + $dir.Name) -Destination $to 
       } 
      } 
      "DIRECTORY" { 
       $q = ($quarantine + $dir.Name + '/') 
       $test = Test-AzureRmDataLakeStoreItem -AccountName $account -Path $q 

       if($test -eq $False) { 
        New-AzureRmDataLakeStoreItem -AccountName $account -Path $q -Folder 
       } 

       Get-DataLakeStoreChildItemRecursive ($path + $dir.Name + '/') $account $q 
      } 
     } 
    } 
} 

Get-DataLakeStoreChildItemRecursive "/adls-dev/raw/amp/" "asdf" "/adls-dev/quarantine/" 
Verwandte Themen