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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 619766
Url: https://administrator.de/forum/dateien-in-unterordner-verschieben-619766.html
Ausgedruckt am: 23.12.2024 um 09:12 Uhr
7 Kommentare
Neuester Kommentar
Moin,
Du machst Dir das Leben viel zu schwer. Warum suchst Du rekursiv?
So sollte das gehen. Ungetestet.
hth
Erik
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
Moin,
Was hat an meinem Originalcode nicht funktioniert? Fehlermeldungen?
Ja klar. Das ist ja auch eine Datei und kein Verzeichnis.
Hier suchst Du im Basisverzeichnis nach Verzeichnissen und Dateien (und nach allem anderen). Es fehlt -directory
Schlechter Stil. Nur so nebenbei.
Hier versuchst Du unterhalb von Dateien Unterverzeichnisse anzulegen.
Nochmal die Frage: Warum suchst Du hier rekursiv?
Und zum Schluss versuchst Du Dateien in eine Datei zu kopieren.
hth
Erik
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."
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
Hi,
weil mich der Code interessiert, habe ich auch mal versucht es nachzustellen. Bei mir funktioniert es leider auch nicht.
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
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
Moin,
Ooops. Das muss natürlich $base_path heißen.
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.
Liebe Grüße
Erik
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.
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.
Liebe Grüße
Erik
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:
Könntest Du bitte nochmal schauen. Ich bin echt am verzweifeln.
Vielen Dank
Chris
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
Moin,
yupp, works as designed. Nur mal so als Tipp: Mal kurz in der Referenz bei Microsoft gucken, hätte geholfen.
Dann legt er auch ein Verzeichnis an.
hth
Erik
yupp, works as designed. Nur mal so als Tipp: Mal kurz in der Referenz bei Microsoft gucken, hätte geholfen.
new-item "$($ma_path.fullname)\$heute" -itemtype "directory"
Dann legt er auch ein Verzeichnis an.
hth
Erik