none
Ordner löschen wenn eine Flag-Datei vorhanden ist RRS feed

  • Frage

  • Hallo liebe Gemeinde,

    folgendes Problem"chen":

    Ich habe im $Arbeitsverzeichnis verschiedene Ordner:
    Ordner_01
    Ordner_02
    Ordner_03
    .
    .
    .

    Auch existieren hier meine Flag-Dateien (Trigger-Dateien zum starten des Löschvorgangs):
    Ordner_01.fin
    Ordner_02.fin
    Ordner_03.fin
    Ordner_04.fin
    .
    .
    .

    Jetzt möchte ich die vorhandenen Ordner mit den Flag-Dateien abgleichen. Existiert Ordner_01 und Ordner01.fin, dann lösche.

    Existiert Ordner_04 nicht, aber Ordner_04.fin (oder auch umgekehrt),  dann lösche bitte nicht.

    Bisher erreichtes:

    Clear-Host
    $Arbeitsverzeichnis = "C:\temp\_PS_TEST"
    $Flag_File = "fin"
    
    # Ordner abfragen
    Get-ChildItem $Arbeitsverzeichnis | 
    ?{ $_.PSisContainer } | 
    #Remove-Item -Recurse -Force #-WhatIf
    % {write-host $_.name}
    
    
    # Flag-Files abfragen
    Get-ChildItem $Arbeitsverzeichnis | 
    ?{ !$_.PSIsContainer -and $_.Name.EndsWith($Flag_File) } | 
    #Remove-Item -Recurse -Force #-WhatIf #
    % {write-host $_.name}

    Wie schaffe ich das, dass ich die Dateien und Ordner miteinander abgleiche? Ich habe jetzt die Ordner und die Dateien. Aber da hapert es nun bei mir. Wie schaffe ich den Abgleich von Ordner und Datei, damit ich letztendlich den Löschvorgang beginnen kann?

    Für ein paar Tipps wäre ich echt dankbar!

    Viele Grüße

    bierdeckel



    • Bearbeitet bierdeckel Samstag, 31. August 2013 11:48
    Samstag, 31. August 2013 11:29

Antworten

  • Hallo,

    also wenn ich alles richtig deute sieht deine Struktur so aus:

        Verzeichnis: F:\temp\_PS_TEST
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    d----        31.08.2013     15:54            Ordner_01
    d----        31.08.2013     15:54            Ordner_02
    d----        31.08.2013     15:54            Ordner_03
    d----        31.08.2013     15:54            Ordner_04
    -a---        31.08.2013     15:55          6 Ordner_01.fin
    -a---        31.08.2013     15:55          6 Ordner_03.fin
    -a---        31.08.2013     15:55          6 Ordner_04.fin
    -a---        31.08.2013     16:00          0 rm.txt

    Dann probiere das hier:
    Clear-Host
    $Arbeitsverzeichnis = "F:\temp\_PS_TEST"
    $Flag_File = "fin"
    $Folders = Get-ChildItem $Arbeitsverzeichnis | Where-Object {$_.PSisContainer}
    foreach ($Folder in $Folders) {
        if (Test-Path "$Arbeitsverzeichnis\$($Folder.Name).$Flag_File") {
            Remove-Item $Folder.FullName -Recurse -Force -WhatIf
        }
    }

    geloescht wuerden dann die Ordner 1,3 und 4, nicht aber 2 weil es fuer den keine FIN Datei gibt, wenn auch die Fin Datei fuer geloeschte Ordner loeschen willst musst du im IF noch diese Zeile hinzufuegen.

    Remove-Item "$Arbeitsverzeichnis\$($Folder.Name).$Flag_File" -WhatIf

    Beste Gruesse
    brima

    Edit:
    Zeile $FinFiles = ... enffernt, wird nicht benoetigt!

     


    Samstag, 31. August 2013 14:20

Alle Antworten

  • Hallo,

    also wenn ich alles richtig deute sieht deine Struktur so aus:

        Verzeichnis: F:\temp\_PS_TEST
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    d----        31.08.2013     15:54            Ordner_01
    d----        31.08.2013     15:54            Ordner_02
    d----        31.08.2013     15:54            Ordner_03
    d----        31.08.2013     15:54            Ordner_04
    -a---        31.08.2013     15:55          6 Ordner_01.fin
    -a---        31.08.2013     15:55          6 Ordner_03.fin
    -a---        31.08.2013     15:55          6 Ordner_04.fin
    -a---        31.08.2013     16:00          0 rm.txt

    Dann probiere das hier:
    Clear-Host
    $Arbeitsverzeichnis = "F:\temp\_PS_TEST"
    $Flag_File = "fin"
    $Folders = Get-ChildItem $Arbeitsverzeichnis | Where-Object {$_.PSisContainer}
    foreach ($Folder in $Folders) {
        if (Test-Path "$Arbeitsverzeichnis\$($Folder.Name).$Flag_File") {
            Remove-Item $Folder.FullName -Recurse -Force -WhatIf
        }
    }

    geloescht wuerden dann die Ordner 1,3 und 4, nicht aber 2 weil es fuer den keine FIN Datei gibt, wenn auch die Fin Datei fuer geloeschte Ordner loeschen willst musst du im IF noch diese Zeile hinzufuegen.

    Remove-Item "$Arbeitsverzeichnis\$($Folder.Name).$Flag_File" -WhatIf

    Beste Gruesse
    brima

    Edit:
    Zeile $FinFiles = ... enffernt, wird nicht benoetigt!

     


    Samstag, 31. August 2013 14:20
  • Hi Brima,

    Prima, das funktioniert! Fast verstanden habe ich es ebenfalls.

    Nur das hier verstehe ich noch nicht ganz.

    $Arbeitsverzeichnis\$($Folder.Name).$Flag_File

    Wie kommt das denn zustande?

    LG

    bierdeckel


    • Bearbeitet bierdeckel Samstag, 31. August 2013 16:46
    Samstag, 31. August 2013 16:45
  • Die PowerShell arbeitet mit Objekten. Hier reden wir von einem System.IO.DirectoryInfo,. und wenn ich von diesem Object die
    Eigenschaft Name brauche um sie in einen String zu bauen ist das die notwendige Syntax. Hier wuerde auch in dem Fall nur $Folder genuegen,
    weil $folder das auswirft, wenn es in "" steht, aber das ist Objekt abhaenging, deshalb gleich die richtige Syntax nutzen.

    Am besten mal damit spielen, siehe hier:

    PS C:\> $folder = Get-Item F:\temp\_PS_TEST\Ordner_04
    
    PS C:\> $folder
    
    
        Verzeichnis: F:\temp\_PS_TEST
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    d----        31.08.2013     15:54            Ordner_04
    
    
    PS C:\> "$folder"
    Ordner_04
    PS C:\> "$folder.name"
    Ordner_04.name
    PS C:\> "$($folder.name)"
    Ordner_04
    PS C:\> "$folder.FullName"
    Ordner_04.FullName
    PS C:\> "$($folder.FullName)"
    F:\temp\_PS_TEST\Ordner_04
    PS C:\> $Folder | Get-Member
    
    
       TypeName: System.IO.DirectoryInfo
    
    Name                      MemberType     Definition
    ----                      ----------     ----------
    Mode                      CodeProperty   System.String Mode{get=Mode;}
    Create                    Method         void Create(), void Create(System.Security.AccessControl.DirectorySecurity ...
    CreateObjRef              Method         System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
    CreateSubdirectory        Method         System.IO.DirectoryInfo CreateSubdirectory(string path), System.IO.Director...
    Delete                    Method         void Delete(), void Delete(bool recursive)
    EnumerateDirectories      Method         System.Collections.Generic.IEnumerable[System.IO.DirectoryInfo] EnumerateDi...
    EnumerateFiles            Method         System.Collections.Generic.IEnumerable[System.IO.FileInfo] EnumerateFiles()...
    EnumerateFileSystemInfos  Method         System.Collections.Generic.IEnumerable[System.IO.FileSystemInfo] EnumerateF...
    Equals                    Method         bool Equals(System.Object obj)
    GetAccessControl          Method         System.Security.AccessControl.DirectorySecurity GetAccessControl(), System....
    GetDirectories            Method         System.IO.DirectoryInfo[] GetDirectories(), System.IO.DirectoryInfo[] GetDi...
    GetFiles                  Method         System.IO.FileInfo[] GetFiles(string searchPattern), System.IO.FileInfo[] G...
    GetFileSystemInfos        Method         System.IO.FileSystemInfo[] GetFileSystemInfos(string searchPattern), System...
    GetHashCode               Method         int GetHashCode()
    GetLifetimeService        Method         System.Object GetLifetimeService()
    GetObjectData             Method         void GetObjectData(System.Runtime.Serialization.SerializationInfo info, Sys...
    GetType                   Method         type GetType()
    InitializeLifetimeService Method         System.Object InitializeLifetimeService()
    MoveTo                    Method         void MoveTo(string destDirName)
    Refresh                   Method         void Refresh()
    SetAccessControl          Method         void SetAccessControl(System.Security.AccessControl.DirectorySecurity direc...
    ToString                  Method         string ToString()
    PSChildName               NoteProperty   System.String PSChildName=Ordner_04
    PSDrive                   NoteProperty   System.Management.Automation.PSDriveInfo PSDrive=F
    PSIsContainer             NoteProperty   System.Boolean PSIsContainer=True
    PSParentPath              NoteProperty   System.String PSParentPath=Microsoft.PowerShell.Core\FileSystem::F:\temp\_P...
    PSPath                    NoteProperty   System.String PSPath=Microsoft.PowerShell.Core\FileSystem::F:\temp\_PS_TEST...
    PSProvider                NoteProperty   System.Management.Automation.ProviderInfo PSProvider=Microsoft.PowerShell.C...
    Attributes                Property       System.IO.FileAttributes Attributes {get;set;}
    CreationTime              Property       datetime CreationTime {get;set;}
    CreationTimeUtc           Property       datetime CreationTimeUtc {get;set;}
    Exists                    Property       bool Exists {get;}
    Extension                 Property       string Extension {get;}
    FullName                  Property       string FullName {get;}
    LastAccessTime            Property       datetime LastAccessTime {get;set;}
    LastAccessTimeUtc         Property       datetime LastAccessTimeUtc {get;set;}
    LastWriteTime             Property       datetime LastWriteTime {get;set;}
    LastWriteTimeUtc          Property       datetime LastWriteTimeUtc {get;set;}
    Name                      Property       string Name {get;}
    Parent                    Property       System.IO.DirectoryInfo Parent {get;}
    Root                      Property       System.IO.DirectoryInfo Root {get;}
    BaseName                  ScriptProperty System.Object BaseName {get=$this.Name;}
    
    
    PS C:\> $Folder | FL *
    
    
    PSPath            : Microsoft.PowerShell.Core\FileSystem::F:\temp\_PS_TEST\Ordner_04
    PSParentPath      : Microsoft.PowerShell.Core\FileSystem::F:\temp\_PS_TEST
    PSChildName       : Ordner_04
    PSDrive           : F
    PSProvider        : Microsoft.PowerShell.Core\FileSystem
    PSIsContainer     : True
    BaseName          : Ordner_04
    Mode              : d----
    Name              : Ordner_04
    Parent            : _PS_TEST
    Exists            : True
    Root              : F:\
    FullName          : F:\temp\_PS_TEST\Ordner_04
    Extension         :
    CreationTime      : 31.08.2013 15:54:50
    CreationTimeUtc   : 31.08.2013 13:54:50
    LastAccessTime    : 31.08.2013 15:54:50
    LastAccessTimeUtc : 31.08.2013 13:54:50
    LastWriteTime     : 31.08.2013 15:54:50
    LastWriteTimeUtc  : 31.08.2013 13:54:50
    Attributes        : Directory

    Also es wuerde auch z.B.: folgendes gehen:

    Clear-Host
    $Arbeitsverzeichnis = "F:\temp\_PS_TEST"
    $Flag_File = "fin"
    $Folders = Get-ChildItem $Arbeitsverzeichnis | Where-Object {$_.PSisContainer}
    foreach ($Folder in $Folders) {
        if (Test-Path "$($Folder.FullName).$Flag_File") {
            Remove-Item $Folder.FullName -Recurse -Force -WhatIf
        }
    }

    Man koennte das ganze Problem auch noch auf andere Art und Weise loesen.

    Beste Gruesse
    brima


    • Bearbeitet brima Samstag, 31. August 2013 17:23
    Samstag, 31. August 2013 17:14
  • Super! Ich wollte mich noch herzlich bedanken. Powershell macht richtig Spaß. ;-)

    Und wer weiß, irgendwann bin ich derjenige, der helfen kann.

    Viele Grüße

    _bierdeckel

    Dienstag, 17. September 2013 12:44