ramin-s
Goto Top

Dateien in Unterordner verschieben

Hallo zusammen,
ich muss ein Skript per Power Shell schreiben die Dateien regelmäßig in Unterordnern verschiebt.
Ich habe einen Scan Ordner. (erste ebene)
Der beinhaltet mehrere Unterordner (Mitarbeiter Ordner ,zweite Ebene), in dem Dateien liegen.
Es sollte ein Skript jeden Abend (um 23:59) ausgeführt werden, das zwei Aufgabe erledigen muss:
1. Einen Ordner in jeden Mitarbeiterordner (zweite Ebene) anlegen muss mit dem Namen „aktuelle Datum des Tages“ (06-11-20) Das wird dritte Ebene. (Scan\Mitarbeiter_abc\06-11-20)
2. Alle Daten in jeweils Mitarbeiterordner (zweite Ebene), die bis diese Zeit da liegen in dritte Ebene im jüngsten Ordner verschieben. Das sollten Dateien mit bestimmten Erstell Datum in den Ordner mit gleiche Erstell Datum verschoben werden. (z.B. Scan\mitarbeiter_abc\xy.pdf(erstelldatum:06.11.20), xy.pdf muss in scan\mitarbeiter_abc\06-11-20 verschoben werden).

mein Skript sieht so aus.
Nr. 1 ist erledigt aber Nr.2 funktioniert nicht.


$heute = Get-Date -UFormat „%d-%m-%y“
$path = "C:\Users\seifi\Scan"
$ma_path = get-Childitem $path -recurse | where {$_.PSIsContainer}

ForEach($dir in (Get-ChildItem '$path' -Recurse | Where{$_.psiscontainer}))
{
$parentPath = (get-item $dir.fullname).parent
If(!(Test-Path "$($dir.fullname)\$heute") -and $parentPath -ne "$heute"){

New-Item "$($dir.fullname)\$heute" -type directory | Out-Null
Write-Host "Folder created in $($dir.fullname)"
}
}

(das folgende funktioniert nicht):
foreach($item in (Get-ChildItem -Recurse -Path $path | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-1))}))
{move-item -path $ma_path -Destination $ma_path\$heute\ -Force}


Wäre sehr lieb, wenn Ihr mir helfen könnt.
Sorry! mein Deutsch ist nicht so gut.

Ramin

Content-ID: 619766

Url: https://administrator.de/forum/dateien-in-unterordner-verschieben-619766.html

Ausgedruckt am: 23.12.2024 um 09:12 Uhr

erikro
erikro 06.11.2020 um 18:34:35 Uhr
Goto Top
Moin,

Du machst Dir das Leben viel zu schwer. Warum suchst Du rekursiv?

$heute = Get-Date -UFormat "%d-%m-%y"  
$base_path = "C:\Users\seifi\Scan"  

# Hier keine rekursive Suche. Es sind ja nur zwei Ebenen und wir
# brauchen ja nur die zweite. Mit dem Parameter -Directory 
# werden nur die Unterverzeichnisse der zweiten Ebenen ausgegeben.
$ma_pathes = get-Childitem $path -Directory

foreach($ma_path in $ma_pathes) {

    if(!(Test-Path $("$ma_path.fullname\$heute"))) {  

        New-Item $("$ma_path.fullname\$heute")  

    }

    # Ich frage mich, wozu das Where-Oject dient. Aber nun gut.
    $files = Get-ChildItem $ma_path -File  | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-1))}

    foreach($file in $files) {

        # Das -Force ist imho auch unnötig
        move-item $file -Destination $ma_path\$heute\ -Force

    }
}

So sollte das gehen. Ungetestet.

hth

Erik
Ramin-s
Ramin-s 09.11.2020 um 14:59:27 Uhr
Goto Top
Hallo,
danke für deine Antwort. Das hat leider nicht funktioniert und ich habe den Code ein bisschen vereinfacht und bei mir angepasst. Ich komme immer noch nicht bei zweite Teil(move-item) weiter!
Es wird mir diesen Fehler angezeigt:
"move-item : Der Pfad "F:\Scan\SKM_C368200743452211.pdf" kann nicht gefunden werden, da er nicht vorhanden ist."

$heute = Get-Date -UFormat "%d-%m-%y"  
$path = "F:\Scan"  
$ma_pathes = get-Childitem $path 

cd $path

foreach($ma_path in $ma_pathes) {
       New-Item "$path\$ma_path\$heute" -ItemType Directory  
    }

$files = Get-ChildItem -File  -recurse  | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(0))}
$target = "$ma_path\$heute"  

    foreach($file in $files) {

        move-item $files -Destination $target -Force

    }

Hast du eine Idee?!
VG
Ramin
erikro
erikro 09.11.2020 um 18:57:29 Uhr
Goto Top
Moin,

Zitat von @Ramin-s:
danke für deine Antwort. Das hat leider nicht funktioniert

Was hat an meinem Originalcode nicht funktioniert? Fehlermeldungen?

und ich habe den Code ein bisschen vereinfacht und bei mir angepasst. Ich komme immer noch nicht bei zweite Teil(move-item) weiter!
Es wird mir diesen Fehler angezeigt:
"move-item : Der Pfad "F:\Scan\SKM_C368200743452211.pdf" kann nicht gefunden werden, da er nicht vorhanden ist."

Ja klar. Das ist ja auch eine Datei und kein Verzeichnis.


> $heute = Get-Date -UFormat "%d-%m-%y"  
> $path = "F:\Scan"  
> $ma_pathes = get-Childitem $path 
> 

Hier suchst Du im Basisverzeichnis nach Verzeichnissen und Dateien (und nach allem anderen). Es fehlt -directory

cd $path

Schlechter Stil. Nur so nebenbei.

> foreach($ma_path in $ma_pathes) {
>        New-Item "$path\$ma_path\$heute" -ItemType Directory  
>     }

Hier versuchst Du unterhalb von Dateien Unterverzeichnisse anzulegen.

> $files = Get-ChildItem -File  -recurse  | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(0))}

Nochmal die Frage: Warum suchst Du hier rekursiv?

$target = "$ma_path\$heute"  
> 
>     foreach($file in $files) {
> 
>         move-item $files -Destination $target -Force
> 
>     }
> 

Und zum Schluss versuchst Du Dateien in eine Datei zu kopieren.

hth

Erik
chris123
chris123 10.11.2020 um 17:09:44 Uhr
Goto Top
Hi,

weil mich der Code interessiert, habe ich auch mal versucht es nachzustellen. Bei mir funktioniert es leider auch nicht.

Was hat an meinem Originalcode nicht funktioniert? Fehlermeldungen?

$heute = Get-Date -UFormat "%d-%m-%y"  
$base_path = "F:\Test\Scan"   
# muss $base_path nicht noch verarbeitet werden? Unter Scan befinden sich die Unterordner um die es geht. 
# Innerhalb dieser jeweiligen Unterordner muss der Ordner mit Tagesdatum erstellt werden und in diesen
# sollen dann die Dateien verschoben werden.

$ma_pathes = get-Childitem $path -Directory

foreach($ma_path in $ma_pathes) {

    if(!(Test-Path $("$ma_path.fullname\$heute"))) {  

        New-Item $("$ma_path.fullname\$heute")  

    }


    $files = Get-ChildItem $ma_path -File  | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-1))}

    foreach($file in $files) {

       
        move-item $file -Destination $ma_path\$heute\ 

    }
}

Fehlermeldungen:
Get-ChildItem : Der Pfad "C:\Users\administrator\..." kann nicht gefunden werden, da er nicht vorhanden ist.
New-Item : Ein Teil des Pfades "C:\Users\administrator\Unterordner1.fullname\10-11-20" konnte nicht gefunden werden.
Es wird auf "C:\Users\administrator\usw." zugegriffen. Kann das was mit der Variablen $base_path zu tun haben?

Ich arbeite mit der PSVersion 5.1.14393.3471

Vielen Dank für Deine Unterstützung!
Chris
erikro
erikro 10.11.2020 um 18:06:06 Uhr
Goto Top
Moin,

Zitat von @chris123:

$heute = Get-Date -UFormat "%d-%m-%y"  
> $base_path = "F:\Test\Scan"   
> # muss $base_path nicht noch verarbeitet werden? Unter Scan befinden sich die Unterordner um die es geht.
> # Innerhalb dieser jeweiligen Unterordner muss der Ordner mit Tagesdatum erstellt werden und in diesen
> # sollen dann die Dateien verschoben werden.
> 
> $ma_pathes = get-Childitem $path -Directory

Ooops. Das muss natürlich $base_path heißen. face-wink


foreach($ma_path in $ma_pathes) {

if(!(Test-Path $("$ma_path.fullname\$heute"))) {

New-Item $("$ma_path.fullname\$heute")

}

Und hier sind die Tüttelchen und Klammern an der falschen Stelle. "$($ma_path.fullname)\$heute" sollte gehen. Es war spät und ein harter Tag. face-wink

Liebe Grüße

Erik
chris123
chris123 11.11.2020 um 12:50:23 Uhr
Goto Top
Ich bekomme es leider nicht hin. Ich denke, die Klammer usw. sind richtig gesetzt.

Allerdings legt er in die Unterordner "F:\Test\Scan\usw" Dateien statt Ordner (11-11-20) an. Und kommt in Zeile 15 bei "Get-ChildItem folgender Fehler:
Get-ChildItem : Der Pfad "C:\Users\administrator.HSMV1\..." kann nicht gefunden werden, da er nicht vorhanden ist.
In Zeile:15 Zeichen:14

Es wird immer noch auf "C:\Users\administrator.HSMV1\..." zugegriffen.

So sieht mein Code jetzt aus:
$heute = Get-Date -UFormat "%d-%m-%y"  
$base_path = "F:\Test\Scan"   
$ma_pathes = get-Childitem $base_path -Directory

foreach($ma_path in $ma_pathes) {

    if(!(Test-Path "$($ma_path.fullname)\$heute"))   
    {

      New-Item "$($ma_path.fullname)\$heute"  

    }

  
    $files = Get-ChildItem $ma_path | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-1))}

    foreach($file in $files) {

       
        move-item $file -Destination $ma_path\$heute\ 
    }
 }

Könntest Du bitte nochmal schauen. Ich bin echt am verzweifeln.

Vielen Dank
Chris
erikro
erikro 11.11.2020 um 17:50:33 Uhr
Goto Top
Moin,

yupp, works as designed. face-wink Nur mal so als Tipp: Mal kurz in der Referenz bei Microsoft gucken, hätte geholfen. face-wink

new-item "$($ma_path.fullname)\$heute" -itemtype "directory"  

Dann legt er auch ein Verzeichnis an. face-wink

hth

Erik