Benutzer mit den meisten Antworten
Ordner löschen wenn eine Flag-Datei vorhanden ist

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
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!- Bearbeitet brima Samstag, 31. August 2013 14:23
- Als Antwort vorgeschlagen Peter Kriegel Montag, 2. September 2013 05:04
- Als Antwort markiert Denniver ReiningMVP, Moderator Freitag, 6. September 2013 09:11
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!- Bearbeitet brima Samstag, 31. August 2013 14:23
- Als Antwort vorgeschlagen Peter Kriegel Montag, 2. September 2013 05:04
- Als Antwort markiert Denniver ReiningMVP, Moderator Freitag, 6. September 2013 09:11
-
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
-
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