LEDZEPPELIN 0 Posted December 9, 2020 Report Posted December 9, 2020 Hallo, ich möchte Dateien die am Namensanfang gleich sind in einen neu zu erzeugenden Ordner verschieben. Beispiel: Auto1 Auto2 Auto3 Sollen alle in Ordner Auto verschoben werden und dieser automatisch neu erzeugt werden. Mit den Scripten kriege ich es nicht hin da ich ja keine Buchstaben löschen will. Wahrscheinlich mache ich bei der Anpassung etwas verkehrt. Wie würde das aussehen wenn der Ursprungsordner d:\Test heißt und die neuen Ordner in diesem Ordner erzeugt werden sollen? Vielen Dank. Quote
LEDZEPPELIN 0 Posted December 9, 2020 Author Report Posted December 9, 2020 Ich denke ich sollte meine Angaben noch etwas genauer machen. Es handelt sich um Dateien die am Anfang geich sind und dann zb noch -bla oder - okay im weiteren Namen führen. Außerdem sind es unterschiedliche Dateitypen wie .ts, .nfo, .jpg etc. Man müßte also festlegen können bis zu welchem Buchstaben sie geprüft und dann zusammen in den sleben Ordner verschoben werden. Dieser Ordner muss natürlich noch angelegt werden mit dem Namen der bei allen Dateien identisch ist. Quote
BOfH_666 579 Posted December 9, 2020 Report Posted December 9, 2020 (edited) Was gefällt Dir denn nicht an dem Script-Beispiel im anderen Thread? Wenn Du die Anzahl der benutzten Stellen des Dateinamens variabel machen möchtest, machst Du aus der dort fest vergebenen Zahl (ich meine die "19") eine Variable und füllst diese vorher, wie Du das für richtig hältst. Edit: Ich beziehe mich übrigens auf Jans Powershell-Script-Beispiel. Edited December 9, 2020 by BOfH_666 Quote
LEDZEPPELIN 0 Posted December 9, 2020 Author Report Posted December 9, 2020 Da ich nicht viel Ahnung habe, hbe ich es versucht umzuschreiben, aber es funktioniert nicht. Sah so aus. foreach ( $Test in Get-ChildItem -Path D:\Test -File ) { if (!(Test-Path -Path $Test.FullName.Substring(0,7))) { New-Item -ItemType Directory -Path $Test.FullName.Substring(0,7) } Move-Item $Test.FullName $Rechnung.FullName.Substring(0,7) } Quote
BOfH_666 579 Posted December 9, 2020 Report Posted December 9, 2020 (edited) OK, bitte Code als Code formatieren. Was ich meinte war, statt die "7" überall direkt hinzuschreiben, eine Variable zu benutzen ... etwa so: $AnzahlZeichen = 7 foreach ( $Test in Get-ChildItem -Path D:\Test -File ) { if (!(Test-Path -Path $Test.FullName.Substring(0, $AnzahlZeichen ))) { New-Item -ItemType Directory -Path $Test.FullName.Substring(0, $AnzahlZeichen ) } Move-Item -Path $Test.FullName -Destination $Test.FullName.Substring(0, $AnzahlZeichen ) } Dann brauchst Du, wenn Du eine andere Anzahl an Zeichen benutzen möchtest, den Code nur an einer Stelle zu ändern. vor 18 Minuten schrieb LEDZEPPELIN: aber es funktioniert nicht. ... ist keine valide Beschreibung. Was funktioniert nicht? Edit: ... und ist mir jetz grad erst aufgefallen ... Du hast beim Move-Item Befehl als -Destination $Rechnung benutzt, obwohl Du in Deinem Code $Rechnung in $Test geändert hattest!!! Edited December 9, 2020 by BOfH_666 Quote
LEDZEPPELIN 0 Posted December 9, 2020 Author Report Posted December 9, 2020 PS C:\Windows\system32> $AnzahlZeichen = 7 foreach ( $Test in Get-ChildItem -Path D:\Test -File ) { if (!(Test-Path -Path $Test.FullName.Substring(0, $AnzahlZeichen ))) { New-Item -ItemType Directory -Path $Test.FullName.Substring(0, $AnzahlZeichen ) } Move-Item -Path $Test.FullName -Destination $Rechnung.FullName.Substring(0, $AnzahlZeichen ) } Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat. In Zeile:6 Zeichen:5 + Move-Item -Path $Test.FullName -Destination $Rechnung.FullName.Su ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat. In Zeile:6 Zeichen:5 + Move-Item -Path $Test.FullName -Destination $Rechnung.FullName.Su ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat. In Zeile:6 Zeichen:5 + Move-Item -Path $Test.FullName -Destination $Rechnung.FullName.Su ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat. In Zeile:6 Zeichen:5 + Move-Item -Path $Test.FullName -Destination $Rechnung.FullName.Su ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat. In Zeile:6 Zeichen:5 + Move-Item -Path $Test.FullName -Destination $Rechnung.FullName.Su ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull Das war das Ergebnis gerade. Quote
BOfH_666 579 Posted December 9, 2020 Report Posted December 9, 2020 (edited) vor 1 Minute schrieb LEDZEPPELIN: Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat. In Zeile:6 Zeichen:5 + Move-Item -Path $Test.FullName -Destination $Rechnung.FullName.Su ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull .... siehe meine Antwort von oben .... Du musst $Rechnung in $Test ändern!!! ... und übrigens, wenn Du 5 gleiche Fehlermeldungen erhältst, genügt es, wenn Du eine davon postest. Edited December 9, 2020 by BOfH_666 Quote
testperson 1,743 Posted December 9, 2020 Report Posted December 9, 2020 Ein wenig OT: Heutzutage würde ich allerdings aus ... if(!(Test-Path -Path $Test.FullName.Substring(0, $AnzahlZeichen))){ ... ... if(-not (Test-Path -Path $Test.FullName.Substring(0, $AnzahlZeichen) -PathType Container)){ ... machen. :) Quote
LEDZEPPELIN 0 Posted December 9, 2020 Author Report Posted December 9, 2020 Das war das Ergebnis gerade. PS C:\Windows\system32> $AnzahlZeichen = 7 foreach ( $Test in Get-ChildItem -Path D:\Test -File ) { if (!(Test-Path -Path $Test.FullName.Substring(0, $AnzahlZeichen ))) { New-Item -ItemType Directory -Path $Test.FullName.Substring(0, $AnzahlZeichen ) } Move-Item -Path $Test.FullName -Destination $Test.FullName.Substring(0, $AnzahlZeichen ) } PS C:\Windows\system32> Aber im Ordner ist alles geblieben wie vorher. Was mache ich falsch? Quote
BOfH_666 579 Posted December 9, 2020 Report Posted December 9, 2020 Mit $AnzahlZeichen = 7 und dem Start-Ordner D:\Test kann da auch nicht viel passieren. Lass Dir doch einfach mal die Werte ausgeben, mit denen das Script arbeitet. Bestimmt fällt es Dir dann auf. $AnzahlZeichen = 7 $StartFolder = 'D:\Test' foreach ( $Test in Get-ChildItem -Path $StartFolder -File ) { $Test.FullName $Test.FullName.Substring(0, $AnzahlZeichen ) } Quote
LEDZEPPELIN 0 Posted December 9, 2020 Author Report Posted December 9, 2020 Und was sagt mir das? PS C:\Windows\system32> $AnzahlZeichen = 7 $StartFolder = 'D:\Test' foreach ( $Test in Get-ChildItem -Path $StartFolder -File ) { $Test.FullName $Test.FullName.Substring(0, $AnzahlZeichen ) } D:\Test\Dateienverschieben.bat D:\Test D:\Test\Dateienverschieben.txt D:\Test D:\Test\Neues Textdokument (2).txt D:\Test D:\Test\Neues Textdokument (3).nfo D:\Test D:\Test\Neues Textdokument.txt D:\Test PS C:\Windows\system32> Quote
daabm 1,377 Posted December 9, 2020 Report Posted December 9, 2020 vor 3 Stunden schrieb LEDZEPPELIN: Das war das Ergebnis gerade. PS C:\Windows\system32> $AnzahlZeichen = 7 foreach ( $Test in Get-ChildItem -Path D:\Test -File ) { if (!(Test-Path -Path $Test.FullName.Substring(0, $AnzahlZeichen ))) { New-Item -ItemType Directory -Path $Test.FullName.Substring(0, $AnzahlZeichen ) } Move-Item -Path $Test.FullName -Destination $Test.FullName.Substring(0, $AnzahlZeichen ) } PS C:\Windows\system32> Aber im Ordner ist alles geblieben wie vorher. Was mache ich falsch? Wohin sollte das denn auch verschoben werden? $Test.Fullname fängt immer mit C:\Test an, und da liegen die ja schon... Schwerer Denkfehler in der Logik, scheint mir Nachtrag: Vielleicht hilft es, wenn Du mal erzählst, was das EIGENTLICHE Ziel ist. Du hast oben nicht das Ziel formuliert, sondern schon eine Teillösung, die möglicherweise ungeeignet ist... Quote
BOfH_666 579 Posted December 10, 2020 Report Posted December 10, 2020 (edited) vor 40 Minuten schrieb LEDZEPPELIN: Und was sagt mir das? PS C:\Windows\system32> $AnzahlZeichen = 7 $StartFolder = 'D:\Test' foreach ( $Test in Get-ChildItem -Path $StartFolder -File ) { $Test.FullName $Test.FullName.Substring(0, $AnzahlZeichen ) } D:\Test\Dateienverschieben.bat D:\Test Schade. Ich hatte gehofft, dass Du es so erkennen kannst. Du hast also im Ordner "D:\Test" Dateien, deren 7 Anfangsbuchstaben, Du für die Erstellung eines neuen Ordners benutzen möchtest. Die erste Datei ist offenbar "Dateienverschieben.bat" der komplette Pfad der Datei ist "D:\Test\Dateienverschieben.bat". Und von diesem kompletten Pfad - von $Test.FullName, benutzt Du die ersten 7 Zeichen!!!! Was sind die ersten 7 Zeichen vom kompletten Pfad? Richtig - "D:\Test". Und das ist der Grund, warum nicht das passiert, was Du erwartest. Edited December 10, 2020 by BOfH_666 Quote
LEDZEPPELIN 0 Posted December 10, 2020 Author Report Posted December 10, 2020 Also zum Ziel: Ich habe einen Ordner in dem verschiedenen Dattypen mit ähnlichen Namen liegen. Ziel ist es jetzt Dateien mit x Übereinstimmungen am Anfang des Namens in neu zu erstellende Ordner zu verschieben. Das der Pfad zu den Zeichen dazugehört wußte ich nicht. Mal sehen wie es aussieht wenn ich aus der 7 eine 12 mache. Hat funktioniert. Vielen Dank. Nur löst es dads Problem leider doch nicht ganz. Ist aber wahrscheinlich auch nicht machbar. Ich müßte die Dateien jetz nämlich erst mal vorsortieren nach Länge des Namens den die Ordner haben sollen, also alle Dateien mit gleichem Namen mit einer Länge bis 10 Buchstaben, bis 8 Buchstaben etc. Diese mwürde ich dann in Extra Ordner legen und dann das Skript mit angepasster Variabler drüberlaufenlassen. Das ist wahrswcheinlich nicht machbar oder? Quote
Dukel 459 Posted December 10, 2020 Report Posted December 10, 2020 Gibt es irgendeinen trenner? Sind immer am Ende Zahlen? Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.