Hilfe bei Shell Script zum verschieben von Ordnern
Hallo,
ich versuche gerade ein Script zu bauen, das folgendes können soll:
1. Einen bestimmten Pfad nach Ordnern mit einem bestimmten Namen durchsuchen (in diesem Fall "Avid1_TEMP")
das klappt auch schon ganz gut mit folgendem Code:
2. innerhalb der gefunden Ordner zwei Ordner tiefer gehen (es sind in jedem Fall immer genau zwei Ordner) und die dort vorhandenen Ordner nach
Datum umbenennen und nummerieren. Das umbenennen bekomme ich auch hin:
Aber ich habe noch keinen blassen Schimmer wie ich die Variable
also die unter Punkt 1 gefundenen Treffer + zwei Ordner tiefer definieren kann.
3. Erschwerend kommt hinzu, dass am Ende die umbenannten Ordner innerhalb des Überordners der Pfade aus Punkt 1 in andere Ordner verschoben werden sollen. Hier habe ich noch nicht einmal Ansätze.
Im Prinzip soll das Ganze so aussehen
1. Pfad1\Avid1_TEMP\OrdnerA\OrdnerB\(hier gibts dann z.B. drei Ordner mit unbekanntem Namen)
wird umbenannt zu
2. Pfad1\Avid1_TEMP\OrdnerA\OrdnerB\(201407101 + 201407102 + 201407103)
und verschoben nach
3. Pfad1\ZielOrdnerA\ZielOrdnerB\(201407101 + 201407102 + 201407103)
Ich hoffe es blickt hier jemand durch das Chaos in meinem Kopf und hat noch einen Tipp wie ich das realisieren kann!
Vielen Dank
ich versuche gerade ein Script zu bauen, das folgendes können soll:
1. Einen bestimmten Pfad nach Ordnern mit einem bestimmten Namen durchsuchen (in diesem Fall "Avid1_TEMP")
das klappt auch schon ganz gut mit folgendem Code:
Get-ChildItem $QuellPfad -Recurse | Where { $_.PSIsContainer } | Where { $_ -match "Avid1_TEMP" } | Select-Object FullName
2. innerhalb der gefunden Ordner zwei Ordner tiefer gehen (es sind in jedem Fall immer genau zwei Ordner) und die dort vorhandenen Ordner nach
Datum umbenennen und nummerieren. Das umbenennen bekomme ich auch hin:
$Datum = Get-Date -format "yyyyMMdd"
$Nr = 1
Get-ChildItem $QuellPfadTiefer | ForEach-Object {$_ | Rename-Item -NewName ("$Datum{0}" -f $Nr++)}
$QuellPfadTiefer
also die unter Punkt 1 gefundenen Treffer + zwei Ordner tiefer definieren kann.
3. Erschwerend kommt hinzu, dass am Ende die umbenannten Ordner innerhalb des Überordners der Pfade aus Punkt 1 in andere Ordner verschoben werden sollen. Hier habe ich noch nicht einmal Ansätze.
Im Prinzip soll das Ganze so aussehen
1. Pfad1\Avid1_TEMP\OrdnerA\OrdnerB\(hier gibts dann z.B. drei Ordner mit unbekanntem Namen)
wird umbenannt zu
2. Pfad1\Avid1_TEMP\OrdnerA\OrdnerB\(201407101 + 201407102 + 201407103)
und verschoben nach
3. Pfad1\ZielOrdnerA\ZielOrdnerB\(201407101 + 201407102 + 201407103)
Ich hoffe es blickt hier jemand durch das Chaos in meinem Kopf und hat noch einen Tipp wie ich das realisieren kann!
Vielen Dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 243286
Url: https://administrator.de/forum/hilfe-bei-shell-script-zum-verschieben-von-ordnern-243286.html
Ausgedruckt am: 25.04.2025 um 10:04 Uhr
14 Kommentare
Neuester Kommentar
Moin mqlman,
also bis zu Punkt 2 konnte ich deiner Beschreibung folgen, das sähe dann so aus:
aber Punkt 3 (das Verschieben), ist mir nicht klar wie sich hier die Pfade genau zusammensetzen sollen. Bitte beschreibe das mal etwas verständlicher.
Grüße Uwe
also bis zu Punkt 2 konnte ich deiner Beschreibung folgen, das sähe dann so aus:
$quellpfad = "C:\temp\quelle"
$quellpfadtiefer = "\OrdnerA\OrdnerB"
$folders = dir $quellpfad -Recurse | ?{$_.PSIsContainer -and $_.Name -like "Avid1_TEMP"}
foreach ($folder in $folders){
$cnt=0
dir "$($folder.FullName)$quellpfadtiefer" | ?{$_.PSIsContainer} | %{Rename-Item $_.FullName -NewName ((get-date -Format "yyyyMMdd")+$cnt++)}
}
Grüße Uwe
Zitat von @mqlmann:
es ist mir regelrecht unangenehm, dass immer Du es bist, der mir auf die Sprünge helfen muss ;)
kein Thema, irgendeiner muss es ja machen es ist mir regelrecht unangenehm, dass immer Du es bist, der mir auf die Sprünge helfen muss ;)
Wenn ich Deinen Code richtig verstehe sollte das doch so funktionieren:
Nicht ganz, wenn du alle umbenannten Ordner in diese Ordnerfolge packen willst, Hier würde es ja sonst zu Dulikaten kommen, also muss der Counter außerhalb der Schleife initialisiert werden und der Move-Befehl war auch nicht ganz korrekt.$quellpfad = "C:\temp"
$quellpfadtiefer = "\Avid MediaFiles\MXF"
$folders = dir $quellpfad -Recurse | ?{$_.PSIsContainer -and $_.Name -like "Avid1_TEMP"}
foreach ($folder in $folders){
$cnt=0
dir "$($folder.FullName)$quellpfadtiefer" | ?{$_.PSIsContainer} | %{Rename-Item $_.FullName -NewName ((get-date -Format "yyyyMMdd")+$cnt++) -passthru } | Move-Item -Destination "$($folder.parent.FullName)$quellpfadtiefer"
}
Hi,
Wenn du noch 2.0 hast, upgraden...
das Script hier läuft ab PS3.0 und müsste es vermutlich beschleunigen und zeigt eine Info an während das Script läuft:
Grüße Uwe
Zitat von @mqlmann:
das Script läuft super. Dummerweise habe ich hier @home nie darüber nachgedacht, dass der Speicher, den das Script
durchsuchen soll, relativ groß ist (30TB um genau zu sein). Dementsprechen lange dauert die Ausführung, ich habe
zwischen 20s und 30s gemessen.
Was mich natürlich auf zwei Fragen bringt: Kann das Get-ChildItem Cmdlt irgendwie beschleunigen?
Wenn du Powershell mit mindestens Version 3.0 hast eventuell ja. Deine aktuelle Powershellversion kannst du dir mit folgendem Befehl anzeigen lassen:das Script läuft super. Dummerweise habe ich hier @home nie darüber nachgedacht, dass der Speicher, den das Script
durchsuchen soll, relativ groß ist (30TB um genau zu sein). Dementsprechen lange dauert die Ausführung, ich habe
zwischen 20s und 30s gemessen.
Was mich natürlich auf zwei Fragen bringt: Kann das Get-ChildItem Cmdlt irgendwie beschleunigen?
$psversiontable.PSVersion.toString()
Und noch eine grundsätzliche Frage: Wie kann ich eine Form aufrufen während das Script läuft? Das Einfachste
wäre hier natürlich dem User die Info zu geben, dass das Script gerade umbenennt und verschiebt.
wäre hier natürlich dem User die Info zu geben, dass das Script gerade umbenennt und verschiebt.
das Script hier läuft ab PS3.0 und müsste es vermutlich beschleunigen und zeigt eine Info an während das Script läuft:
$myjob = [Powershell]::Create().AddScript({
$quellpfad = "C:\temp"
$quellpfadtiefer = "\Avid MediaFiles\MXF"
$folders = dir $quellpfad -Filter "Avid1_TEMP" -Recurse -Directory
foreach ($folder in $folders){
$cnt=0
dir "$($folder.FullName)$quellpfadtiefer" -Directory | %{Rename-Item $_.FullName -NewName ((get-date -Format "yyyyMMdd")+$cnt++) -passthru } | Move-Item -Destination "$($folder.parent.FullName)$quellpfadtiefer"
}
})
$myjob.BeginInvoke()| out-null
while($myjob.InvocationStateInfo.State -eq "Running"){
Write-Progress -Activity "Ordnerverarbeitung" -Status "Bitte warten Umbenennung läuft ..."
}
write-host "Vorgang abgeschlossen!"
hatten wir doch alles schon hier:
Powershell GUI bleibt während einer While schleife hängen...
Powershell GUI bleibt während einer While schleife hängen...
function GenerateForm {
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
#endregion
#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$label1 = New-Object System.Windows.Forms.Label
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects
$handler_form1_Shown=
{
#------------ Arbeitscode ---------------
$quellpfad = "C:\temp"
$quellpfadtiefer = "\Avid MediaFiles\MXF"
$folders = dir $quellpfad -Recurse | ?{$_.PSIsContainer -and $_.Name -like "Avid1_TEMP"}
foreach ($folder in $folders){
$cnt=0
dir "$($folder.FullName)$quellpfadtiefer" | ?{$_.PSIsContainer} | %{Rename-Item $_.FullName -NewName ((get-date -Format "yyyyMMdd")+$cnt++) -passthru } | Move-Item -Destination "$($folder.parent.FullName)$quellpfadtiefer"
}
# ------------------------------------
#Form schließen wenn fertig
$form1.Close()
}
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
$form1.WindowState = $InitialFormWindowState
}
#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 65
$System_Drawing_Size.Width = 325
$form1.ClientSize = $System_Drawing_Size
$form1.ControlBox = $False
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.FormBorderStyle = 3
$form1.Name = "form1"
$form1.Text = "Status"
$form1.StartPosition = 1
$form1.add_Shown($handler_form1_Shown)
$label1.DataBindings.DefaultDataSourceUpdateMode = 0
$label1.Font = New-Object System.Drawing.Font("Arial",12,1,3,0)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 9
$label1.Location = $System_Drawing_Point
$label1.Name = "label1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 41
$System_Drawing_Size.Width = 301
$label1.Size = $System_Drawing_Size
$label1.TabIndex = 0
$label1.Text = "Umbenennung läuft... Bitte warten."
$label1.TextAlign = 32
$form1.Controls.Add($label1)
#endregion Generated Form Code
#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null
} #End Function
#Call the Function
GenerateForm