sombetzki
Goto Top

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

Content-ID: 74178435614

Url: https://administrator.de/contentid/74178435614

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

michi1983
michi1983 05.10.2023 aktualisiert um 19:09:38 Uhr
Goto Top
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ß
Sombetzki
Sombetzki 05.10.2023 um 20:36:21 Uhr
Goto Top
Hallo michi1983
er kopiert mir aber nicht die ganzen unterordner, sondern nur einmal .ready
mayho33
mayho33 05.10.2023 aktualisiert um 20:49:38 Uhr
Goto Top
Zitat von @michi1983:

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
Crusher79
Crusher79 05.10.2023 aktualisiert um 21:33:32 Uhr
Goto Top
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 ....


[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
Crusher79
Crusher79 05.10.2023 um 21:39:36 Uhr
Goto Top
Zitat von @Sombetzki:

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.
7907292512
Lösung 7907292512 05.10.2023 aktualisiert um 21:44:37 Uhr
Goto Top
$source = "d:\work"  
$destination = "e:\done"  
Get-ChildItem $source -File -Recurse -Filter ".ready" | %{move-item $_.DirectoryName -Destination $destination -verbose}  
Sid.
Crusher79
Crusher79 05.10.2023 um 21:50:16 Uhr
Goto Top
@7907292512 wollte schon sagen: recurse vs. verbose face-wink

Ja ich hab vlt. zu kompliziert gedacht. Dachte die .ready vom Leitrechner oder Whatever wäre ggf. tiefer versenkt. Ausgehend von der obersten Ebene wäre das etwas übersichtlicher.
Sombetzki
Sombetzki 05.10.2023 um 22:41:13 Uhr
Goto Top
@all
VielenDank es funktioniert

VG
gso
Sombetzki
Sombetzki 06.10.2023 um 12:04:30 Uhr
Goto Top
@7907292512
könnte man es auch etwas schöner machen, ohne das er eine Fehlermeldung bringt wenn er die Datei nicht findet?

gso
7907292512
7907292512 06.10.2023 aktualisiert um 12:52:08 Uhr
Goto Top
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

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 | .................  
Sombetzki
Sombetzki 06.10.2023 um 14:54:18 Uhr
Goto Top
also er macht das was er soll, nur kommt zusätzlich diese Meldung:

Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "File" entspricht.
In C:\scripte\test_1.ps1:3 Zeichen:23

back-to-topGet-ChildItem $source -File -Recurse -Filter ".fetched" | %{move-item ...

back-to-top~~~~~

+ CategoryInfo : InvalidArgument: (face-smile [Get-ChildItem], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
7907292512
7907292512 06.10.2023 aktualisiert um 15:22:23 Uhr
Goto Top
Klassischer Powershell Anfängerfehler ... Du nutzt eine vieeeeeeel zu alte Powershell die kennt den Parameter -File bei Get-ChildItem noch nicht face-wink. 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
$source = "d:\work"    
$destination = "e:\done"    
Get-ChildItem $source -Recurse -Filter ".ready" | ?{!$_.PSIsContainer} | %{move-item $_.DirectoryName -Destination $destination -verbose}    
Sombetzki
Sombetzki 06.10.2023 um 15:32:10 Uhr
Goto Top
also wenn ich unter version schaue steht dort 5.1.19041.3031
7907292512
7907292512 06.10.2023 aktualisiert um 15:41:58 Uhr
Goto Top
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
$host.Version
oder
$PSVersionTable.PSVersion
und diese sollten mindestens die 5er liefern.
Sombetzki
Sombetzki 06.10.2023 um 15:47:00 Uhr
Goto Top
aber wie geht dass? das ist ein Windows 10PRO Rechner
7907292512
7907292512 06.10.2023 aktualisiert um 15:52:37 Uhr
Goto Top
Zitat von @Sombetzki:

aber wie geht dass? das ist ein Windows 10PRO Rechner
Bist du da gaaaanz sicher face-big-smile? 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.
Sombetzki
Sombetzki 06.10.2023 um 15:59:43 Uhr
Goto Top
anbei meine Rückmeldung auf deine Befehle:

PS C:\Windows\system32> $host.Version

Major Minor Build Revision
----- ----- --------
5 1 19041 3031


PS C:\Windows\system32> $PSVersionTable.PSVersion

Major Minor Build Revision
----- ----- --------
5 1 19041 3031


PS C:\Windows\system32>
7907292512
Lösung 7907292512 06.10.2023 aktualisiert um 16:04:54 Uhr
Goto Top
RTFM
Get-ChildItem
Works out of the Box. Liegt an deiner Kiste. Alternativer Code der das Problem umgeht steht ebenfalls oben, ich bin raus.
🖖
mayho33
mayho33 06.10.2023 um 18:38:26 Uhr
Goto Top
Zitat von @Crusher79:
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!
Crusher79
Crusher79 06.10.2023 aktualisiert um 20:56:49 Uhr
Goto Top
Zitat von @mayho33:

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.
mayho33
mayho33 06.10.2023 um 21:16:42 Uhr
Goto Top
Zitat von @Crusher79:

Zitat von @mayho33:

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!
Crusher79
Crusher79 06.10.2023 aktualisiert um 21:44:43 Uhr
Goto Top
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!

Ä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/ face-big-smile
mayho33
mayho33 06.10.2023 um 21:51:44 Uhr
Goto Top
Zitat von @Crusher79:
Ähm nein. Eig. nicht.
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!
Crusher79
Crusher79 06.10.2023 um 22:00:39 Uhr
Goto Top
@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. face-wink