Alle Ordner die Datei ".ready" enthalten kpl verschieben
Hallo,
ich habe einen Ordner "Work" mit mehreren Unterordnern.
Nun möchte ich all Unterordner die die Datei ".ready" enthalten kpl. (alle Dateien und Unterordner) in einen anderen Ordner "Done" verschieben.
könntet ihr mir da vielleicht weiter helfen?
Vielen Dank im voraus schonmal.
gso
ich habe einen Ordner "Work" mit mehreren Unterordnern.
Nun möchte ich all Unterordner die die Datei ".ready" enthalten kpl. (alle Dateien und Unterordner) in einen anderen Ordner "Done" verschieben.
könntet ihr mir da vielleicht weiter helfen?
Vielen Dank im voraus schonmal.
gso
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 74178435614
Url: https://administrator.de/contentid/74178435614
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
24 Kommentare
Neuester Kommentar
Zitat von @michi1983:
Hallo,
mit Powershell z.B.:
Kollege @7907292512 wird mich sicher gleich korrigieren 😋
Gruß
Hallo,
mit Powershell z.B.:
Get-ChildItem -Path "C:\Pfad\zum\Work" -Recurse -Filter ".ready" | ForEach-Object { Move-Item $_.FullName -Destination "C:\Pfad\zum\Done" }
Kollege @7907292512 wird mich sicher gleich korrigieren 😋
Gruß
Ist ja schon fast richtig 🤷♂️😉
#Test
Get-ChildItem -Path "C:\__Data" -Recurse -Filter "*.ready" | select -ExpandProperty FullName
C:\__Data\A\.ready
C:\__Data\B\BA\.ready
C:\__Data\C\CA\.ready
C:\__Data\C\CB\.ready
C:\__Data\C\CC\.ready
C:\__Data\D\DA\.ready
C:\__Data\D\DB\.ready
C:\__Data\D\DC\.ready
C:\__Data\D\DD\.ready
C:\__Data\E\EA\.ready
C:\__Data\E\EC\.ready
Könnte man wohl noch eleganter machen. Vielleicht sogar in einen 1- oder 2-Zeiler packen. Aber wozu?
$source = "C:\__Data"
$destination = "C:\__Done"
$hasFiles = Get-ChildItem -Path $source -Recurse -Filter "*.ready" | % { (Split-Path $_.FullName -Parent)}
foreach ($item in $hasFiles)
{
$moveTo = Split-Path ([regex]::Replace($item, "__Data", "__Done", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)) -Parent
Start-Process -FilePath "cmd.exe" -ArgumentList "/c MD $([char]34)$moveTo$([char]34)"
Move-Item $item -Destination $moveTo -Force
}
Und das Ergebnis schaut dann so aus:
Get-ChildItem -Path "C:\__Done" -Recurse -Filter "*.ready" | select -ExpandProperty FullName
C:\__Done\A\.ready
C:\__Done\B\.ready
C:\__Done\C\.ready
C:\__Done\C\CB\.ready
C:\__Done\C\CC\.ready
C:\__Done\D\.ready
C:\__Done\D\DB\.ready
C:\__Done\D\DC\.ready
C:\__Done\D\DD\.ready
C:\__Done\E\.ready
C:\__Done\E\EC\.ready
Hallo,
naja irgendwie unschön aber mit Liebe gemacht.
Idee Base-Dir je nach Anwendung nehmen. Ziel Objekt in Unter-Unter-Ordnern. Die Differenz der Sub-Elemente wo die Datei liegt zum Base-Dir nehmen, um sowas wie "parent.parent.parent" zu vermeiden.
Ja ich bekomme es nicht in eine Zeile ....
.ready unter 2.1 in Unter-Unter-Ebene
Sub1 nach fertig kopiert. Ort kann auch woanders liegen....
naja irgendwie unschön aber mit Liebe gemacht.
Idee Base-Dir je nach Anwendung nehmen. Ziel Objekt in Unter-Unter-Ordnern. Die Differenz der Sub-Elemente wo die Datei liegt zum Base-Dir nehmen, um sowas wie "parent.parent.parent" zu vermeiden.
Ja ich bekomme es nicht in eine Zeile ....
[string] $rootPath = "C:\temp\pdf"
$readyPath = $(Get-ChildItem $rootPath -Recurse -Filter '*.ready').Directory
$FSO = Get-Item -Path $rootPath -Force
$countBase = $FSO.FullName.Split("\\").Count
$countCurr = $($readyPath -split "\\").Count
$sourceDir = $($readyPath -split "\\")[0..$($countCurr-$countBase+1)] -join "\"
$targetDir = "C:\temp\pdf\fertig"
Move-Item -Path $sourceDir $targetDir
.ready unter 2.1 in Unter-Unter-Ebene
pdf
│
│
├───sub1
│ file0001.pdf
│ file0002.pdf
│ file0003.pdf
│ file0004.pdf
│
└───sub2
│ file0006.pdf
│ file0007.pdf
│ file0008.pdf
│
└───sub21
.ready
file0005.pdf
Sub1 nach fertig kopiert. Ort kann auch woanders liegen....
pdf
│
├───fertig
│ │ file0006.pdf
│ │ file0007.pdf
│ │ file0008.pdf
│ │
│ └───sub21
│ .ready
│ file0005.pdf
│
└───sub1
file0001.pdf
file0002.pdf
file0003.pdf
file0004.pdf
Zitat von @Sombetzki:
Hallo michi1983
er kopiert mir aber nicht die ganzen unterordner, sondern nur einmal .ready
Hallo michi1983
er kopiert mir aber nicht die ganzen unterordner, sondern nur einmal .ready
Blöde Frage. Ich habe es Struktur erhaltend aufgebaut. Die Subfolder, egal wo die .ready liegt, bleiben am neuen Ort erhalten.
War es so gemeint? Wie gesagt, ist egal wo .ready liegt. Die Schritte bis zum Base-Dir werden automatisch berechnet.
$source = "d:\work"
$destination = "e:\done"
Get-ChildItem $source -File -Recurse -Filter ".ready" | %{move-item $_.DirectoryName -Destination $destination -verbose}
Zitat von @Sombetzki:
@7907292512
könnte man es auch etwas schöner machen, ohne das er eine Fehlermeldung bringt wenn er die Datei nicht findet?
gso
@7907292512
könnte man es auch etwas schöner machen, ohne das er eine Fehlermeldung bringt wenn er die Datei nicht findet?
gso
Das ist der Default wenn nichts gefunden wird wird auch nichts gemacht, es wird auch kein Fehler geworfen!
Wenn ein Fehler geworfen wird hast du wohl (Glaskugel) zu wenig Zugriffsrechte auf einen der Ordner, in dem Fall hilft der Parameter -ErrorAction SilentlyContinue
get-childitem $source -File -Recurse -Filter ".ready" -ErrorAction SilentlyContinue | .................
Klassischer Powershell Anfängerfehler ... Du nutzt eine vieeeeeeel zu alte Powershell die kennt den Parameter -File bei Get-ChildItem noch nicht . Powershell 2 ist schon lange deprecated! Also bitte dringend mindestens auf Version 5.1 aktualisieren!!
Willl man es trotzdem mit Powershell Version <=3 nutzen (definitiv nicht empfohlen da diverse Bugs) muss man es so umschreiben
Willl man es trotzdem mit Powershell Version <=3 nutzen (definitiv nicht empfohlen da diverse Bugs) muss man es so umschreiben
$source = "d:\work"
$destination = "e:\done"
Get-ChildItem $source -Recurse -Filter ".ready" | ?{!$_.PSIsContainer} | %{move-item $_.DirectoryName -Destination $destination -verbose}
Dann guckst du wohl an der falschen Stelle, bzw. hast eine Konsole mit der 2er Version geöffnet. Die Meldung oben ist klassische und eindeutig und unmissverständlich der Indiz das eine alte Shell genutzt wird, glaubs mir.
Die tatsächliche Version bekommst du mit
oder
und diese sollten mindestens die 5er liefern.
Die tatsächliche Version bekommst du mit
$host.Version
$PSVersionTable.PSVersion
Bist du da gaaaanz sicher ? In dem Fall kann er keine 2er haben die haben von Haus aus die 5er.
Dann kann ich mir nur vorstellen das deine Shell mit dem Parameter -Version 2 aufgerufen wird, mit welchem sich auf die 2er zurückfallen lässt. Das siehst du mit den obigen Befehlen.
Alternativer Code seht oben , der funktioniert sowohl in der 3er als auch in der 5er.
Dann kann ich mir nur vorstellen das deine Shell mit dem Parameter -Version 2 aufgerufen wird, mit welchem sich auf die 2er zurückfallen lässt. Das siehst du mit den obigen Befehlen.
Alternativer Code seht oben , der funktioniert sowohl in der 3er als auch in der 5er.
RTFM
Get-ChildItem
Works out of the Box. Liegt an deiner Kiste. Alternativer Code der das Problem umgeht steht ebenfalls oben, ich bin raus.
🖖
Get-ChildItem
Works out of the Box. Liegt an deiner Kiste. Alternativer Code der das Problem umgeht steht ebenfalls oben, ich bin raus.
🖖
Zitat von @Crusher79:
naja irgendwie unschön aber mit Liebe gemacht.
Base-Dir nehmen, um sowas wie "parent.parent.parent" zu vermeiden.
naja irgendwie unschön aber mit Liebe gemacht.
Base-Dir nehmen, um sowas wie "parent.parent.parent" zu vermeiden.
Es ist schlagfest und kackt selbst bei PS v2 nicht ab. BaseDir hin oder her, soo viel schöner ist deines jetzt auch nicht gemacht. 😋
Aber eigentlich habe ich nicht wirklich Bock auf Schw...vergleich. Deshalb allen einen schönen Abend!
Zitat von @mayho33:
Aber eigentlich habe ich nicht wirklich Bock auf Schw...vergleich. Deshalb allen einen schönen Abend!
Aber eigentlich habe ich nicht wirklich Bock auf Schw...vergleich. Deshalb allen einen schönen Abend!
??? Lies nochmal. Von dir war da eig. nicht die Rede. Wo bitte nahm ich bezug zu deinen Post? Wenn ich sowas vorhab, erwähn ich die Person im Post oder mache eine Quote. Damit derjenige auch weiß wer ihn da schön zusammen###t.
Zitat von @Crusher79:
??? Lies nochmal. Von dir war da eig. nicht die Rede. Wo bitte nahm ich bezug zu deinen Post? Wenn ich sowas vorhab, erwähn ich die Person im Post oder mache eine Quote. Damit derjenige auch weiß wer ihn da schön zusammen###t.
Zitat von @mayho33:
Aber eigentlich habe ich nicht wirklich Bock auf Schw...vergleich. Deshalb allen einen schönen Abend!
Aber eigentlich habe ich nicht wirklich Bock auf Schw...vergleich. Deshalb allen einen schönen Abend!
??? Lies nochmal. Von dir war da eig. nicht die Rede. Wo bitte nahm ich bezug zu deinen Post? Wenn ich sowas vorhab, erwähn ich die Person im Post oder mache eine Quote. Damit derjenige auch weiß wer ihn da schön zusammen###t.
Du hast doch auf mein Posting geantwortet mit "parent.parent.parent". Ja das habe ich drinnen. Darum war für mich klar, dass du dich darauf beziehst.
Wenn das nicht so war, dann bitte ich dich um Entschuldigung!
Zitat von @mayho33:
Du hast doch auf mein Posting geantwortet mit "parent.parent.parent". Ja das habe ich drinnen. Darum war für mich klar, dass du dich darauf beziehst.
Wenn das nicht so war, dann bitte ich dich um Entschuldigung!
Du hast doch auf mein Posting geantwortet mit "parent.parent.parent". Ja das habe ich drinnen. Darum war für mich klar, dass du dich darauf beziehst.
Wenn das nicht so war, dann bitte ich dich um Entschuldigung!
Ähm nein. Eig. nicht. Es war mehr die Verzweifelung, da der Fragesteller etwas ungenau war. Mitunter tun Leitrechner o.ä. komische Dinge. Manche nutzen Ordnerstrukturen um Workflows abzubilden.
parent.parent bezog sich eig. auf meine eigene Vorarbeit. Hatte etwas überlegt und getestet bevor ich geschrieben hab. parent.parent.parent o.ä. kam mir da blöd vor. Zumal ich die Frage eh etwas für mich erweitert hab. Was wenn die Datei tief unten ist? Hab also nach einer gewissen Dynamik gesucht und irgendwie dann gefunden. Dachte sogar, es gebe eine PowerShell Objekt Möglichkeit um da elegant hinzukommen wo ich hin kommen wollte.
PSv2 ist zum Glück für mich erledigt. Wir hatten bis vor 6 Monaten noch an die 100 Kassen mit Windows 7. Jetzt gehört das der Vergangenheit an! Freiheit! Naja..... bis auf die neuen, nervigen, immer wieder vorkommenden Fiskaly Fehler... Zumal HIER immer alls grün ist: https://status.fiskaly.com/
Meine Fresse! Ja, dann nochmal Sorry!
Wie man sieht ist Parent.Patent.Parent zumindest nicht der Wahnsinn eines einzigen Geistes 😅
Ein schönes WE wünsche ich dir!
Wie man sieht ist Parent.Patent.Parent zumindest nicht der Wahnsinn eines einzigen Geistes 😅
Ein schönes WE wünsche ich dir!
@mayho33 ne parent wohl immer das Mittel der Wahl. Nein ich dachte wir reden über File.System.Objekte. Hätte ja sein könnne, dass MS sowas wie "current-working" dir mit reinpackt, dass man automatisch - so wie wir Menschen es interpretieren würden - den Ordner da vorgesetzt bekommt. Das komplette Pfadanteil schon damit eliminiert werden.
Gut, da gibt es ja immer noch relative vs. absolute Pfade. Aber selbst da kam ich bei meinen überlegungen nicht weiter.
Wenn wir Uhrzeiten mit Diff vergleichen erhalten wir ja ein Objekt, dass von ms bis Lichtjahre uns alles bietet. Hatte erst die Hoffnung, dass es mit PowerShell in Version 5000.x.x.xx. da irgendwie noch andere Möglichkeiten gibt. MS hat ja auch wirklich viel getan in den letzten Jahren.
Gut, da gibt es ja immer noch relative vs. absolute Pfade. Aber selbst da kam ich bei meinen überlegungen nicht weiter.
Wenn wir Uhrzeiten mit Diff vergleichen erhalten wir ja ein Objekt, dass von ms bis Lichtjahre uns alles bietet. Hatte erst die Hoffnung, dass es mit PowerShell in Version 5000.x.x.xx. da irgendwie noch andere Möglichkeiten gibt. MS hat ja auch wirklich viel getan in den letzten Jahren.