Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Ordnerstruktur aus Dateinamen erstellen

Frage Entwicklung Batch & Shell

Mitglied: robcomboy

robcomboy (Level 1) - Jetzt verbinden

15.04.2007, aktualisiert 18.10.2012, 9113 Aufrufe, 62 Kommentare

Hallo, hat jemand eine Idee, wie es möglich ist aus einem Dateinamen eine Ordnerstruktur zu erstellen.
Ich habe mir Playlisten generiert, die nach dem folgenden Prinzip benannt sind.

Artist - Album - Disk01.m3u

Aus dieser Datei würde ich gerne eine Ordnerstruktur erstellen.
Im Ordner Album liegt der Ordner Disk01.
Album wiederum liegt im Ordner Artist.
Und die Playlist soll am Ende in den Ordner Disk01 verschoben werden.

Vielleicht hat ja jemand eine Idee, wo man sowas machen könnte.

Danke schon mal.
62 Antworten
Mitglied: miniversum
15.04.2007 um 17:00 Uhr
Angenommen die Batch liegt im gleichen Verzeichnis wie deine Playlist (Artist - Album - Disk01.m3u), dann:

01.
@echo off 
02.
set playlist="Artist - Album - Disk01.m3u" 
03.
for /F "tokens=1-3 delims=- " %%a in (%playlist%) do md "%%a\%%b\%%c" && move %playlist% "%%a\%%b\%%c"
miniversum
Bitte warten ..
Mitglied: bastla
15.04.2007 um 17:25 Uhr
Hallo robcomboy!

Zur Abwechslung einmal etwas VBS:
01.
'OrdnerStrukturErzeugen.vbs 
02.
If WScript.Arguments.Count < 1 Then 
03.
	WScript.Echo "Bitte Startordner beim Aufruf angeben oder auf das Script ziehen!" 
04.
	WScript.Quit(1)	 
05.
End If 
06.
Set fso = CreateObject("Scripting.FileSystemObject") 
07.
BasisPfad = WScript.Arguments(0) 
08.
If Not fso.FolderExists(BasisPfad) Then 
09.
	WScript.Echo "Der Startordner wurde nicht gefunden!" 
10.
	WScript.Quit(1)	 
11.
End If 
12.
For Each Datei In fso.GetFolder(BasisPfad).Files 
13.
	If Right(Datei.Name, 4) = ".m3u" Then 
14.
		Ordner = Split(Left(Datei.Name, Len(Datei.Name) - 4), "-") 
15.
		Pfad = BasisPfad 
16.
		For i = 0 To UBound(Ordner) 
17.
			Pfad = Pfad & "\" & Trim(Ordner(i)) 
18.
			If Not fso.FolderExists(Pfad) Then fso.CreateFolder(Pfad) 
19.
		Next 
20.
		Datei.Move Pfad & "\" 
21.
	End If 
22.
Next 
23.
WScript.Echo "Fertig."
Aufruf zB mit
01.
C:\Scripts\OrdnerStrukturErzeugen.vbs "D:\Meine vielen Musikdateien"
Grüße
bastla
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 18:36 Uhr
Hallo Bastla, Danke für deine Mühe die du dir gemacht hast.
Ich habe das Script auch gleich schon ausprobiert.

Leider funktioniert es nicht einen Ordner drauf zu ziehen, noch mit einer Befehlszeile, wie du es in deinem Beispiel vorgemacht hast.

Immer wenn ich das Script über eine CMD mit dem Pfad aufrufe, bekomme ich die folgende Meldung.

"Bitte Startordner beim Aufruf angeben oder auf das Script ziehen"

Danke schonmal,
Grüße, Robcomboy
Bitte warten ..
Mitglied: bastla
15.04.2007 um 18:49 Uhr
Hallo robcomboy!

Jetzt bin ich ein wenig ratlos: Ich habe die oben stehende Version nochmals aus dem Forum heruntergeladen und mit Erfolg auf beide Arten getestet. Insbesondere per Drag & Drop dürfte es ohnehin nicht zu diesem Fehler kommen, da ja auf jeden Fall ein Argument übergeben wird.

Schreib vielleicht zum Testen als erste Zeile ein
01.
WScript.Echo WScript.Arguments.Count
hinein - damit wird die Anzahl der übergebenen Argumente angezeigt.

Grüße
bastla
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 19:04 Uhr
Ich habe die Zeile eingefügt und er gibt mir "0" aus.

Ich hab auch den Ordner noch mal draufgezogen, in dem die m3us liegen.
Dasselbe, wieder "0"

Woran könnte das liegen?
Bitte warten ..
Mitglied: bastla
15.04.2007 um 19:10 Uhr
Hallo robcomboy!

Woran könnte das liegen?
Da habe ich momentan wirklich keine Ahnung ...

... however, damit Du aber doch noch zu Deiner Struktur kommst, ersetze einfachen den ganzen Parameter- und Ordner-Check-Teil (also die Zeilen vor dem "For Each") durch die Zeile
01.
BasisPfad = "D:\Vollständiger Pfad zum Ordner mit den m3u-Dateien"
und versuch es dann mit einem Aufruf ohne Argumente (oder einem Doppelklick) - sinnvoller Weise nur mit einigen Testdaten.

Grüße
bastla
Bitte warten ..
Mitglied: miniversum
15.04.2007 um 19:17 Uhr
ach jetzt versteh ich erst wie Du das genau haben willst. Dann korrigiere ich mein Posting zu folgendem:
01.
@echo off 
02.
for /F "delims=" %%a in (dir /b /A-D *.m3u) do call dodir "%%a" 
03.
goto ende 
04.
 
05.
:dodir 
06.
for /F "tokens=1-3 delims=- " %%a in (%1) do md "%%a\%%b\%%c" && move %1 "%%a\%%b\%%c" 
07.
goto eof 
08.
 
09.
:ende
Diese batchdatei legst du einfach in das Verzeichnis mit deinen Playlists.

miniversum
Bitte warten ..
Mitglied: bastla
15.04.2007 um 19:22 Uhr
@miniversum

Ein Grund, warum ich es per VBS versucht habe, sind eventuelle Leerstellen in Artist und / oder Album ...

Grüße
bastla
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 19:24 Uhr
Wenn ich alles Richtig gemacht habe, sieht das Ding jetzt so aus.

[code]
BasisPfad = "G:\01\m3u"
For Each Datei In fso.GetFolder(BasisPfad).Files
If Right(Datei.Name, 4) = ".m3u" Then
Ordner = Split(Left(Datei.Name, Len(Datei.Name) - 4), "-")
Pfad = BasisPfad
For i = 0 To UBound(Ordner)
Pfad = Pfad & "\" & Trim(Ordner(i))
If Not fso.FolderExists(Pfad) Then fso.CreateFolder(Pfad)
Next
Datei.Move Pfad & "\"
End If
Next
WScript.Echo "Fertig."
[/code]

Dann Krieg ich die Meldung das,

Objekt erforderlich "fso"
Bitte warten ..
Mitglied: miniversum
15.04.2007 um 19:26 Uhr
Ok macht Sinn.
Wären dann auch Bindestriche abgedeckt???

Ich korrigiere meins dannochmal zu:
<code>@echo off & enabledelayedexpansion
for /F "delims=" %%a in (dir /b /A-D *.m3u) do call dodir "%%a"
goto ende

:dodir
for /F "tokens=1-3 delims=-" %%a in (%1) do (
set "artist=%%a"
set "album=%%b"
set "titel=%%c"
set "artist=%artist:~0,-1%"
set "allbum=%album:~1,-1%"
set "titel=%titel:~1%"
md "%artist%"\"%album%"\"%titel%"
move %1 "%artist%\%album%\%titel%"
)
goto eof

:ende

miniversum
Bitte warten ..
Mitglied: bastla
15.04.2007 um 19:29 Uhr
Hallo robcomboy!

Sorry, eine Zeile zuviel weggeworfen ...

01.
Set fso = CreateObject("Scripting.FileSystemObject") 
02.
BasisPfad = "G:\01\m3u" 
03.
For Each Datei In fso.GetFolder(BasisPfad).Files 
04.
    If Right(Datei.Name, 4) = ".m3u" Then 
05.
        Ordner = Split(Left(Datei.Name, Len(Datei.Name) - 4), "-") 
06.
        Pfad = BasisPfad 
07.
        For i = 0 To UBound(Ordner) 
08.
            Pfad = Pfad & "\" & Trim(Ordner(i)) 
09.
            If Not fso.FolderExists(Pfad) Then fso.CreateFolder(Pfad) 
10.
        Next 
11.
        Datei.Move Pfad & "\" 
12.
    End If 
13.
Next 
14.
WScript.Echo "Fertig."
Grüße
bastla
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 19:30 Uhr
Angenommen die Batch liegt im gleichen
Verzeichnis wie deine Playlist (Artist -
Album - Disk01.m3u), dann:

01.
@echo off 
02.
> set playlist="Artist - Album - 
03.
> Disk01.m3u" 
04.
> for /F "tokens=1-3 delims=- " %%a 
05.
> in (%playlist%) do md "%%a\%%b\%%c" 
06.
> && move %playlist% 
07.
> "%%a\%%b\%%c" 
08.
> 
miniversum


Hallo, habe deine Batch auch probiert.
Den Namen der Playlist die ich reingeschrieben habe, war als beispiel gedacht,
Also, egal was vor bzw. nach dem " - " steht, darua soll dann der entsprechende Ordner und dessen Unterordner erstellt werden.
Mit deiner Lösung wird anhand der vordefinierten m3u die Ordnerstruktur erstellt.
Dieses würde aber nicht für eine vielzahl von Playlist funktionieren, sondern nur für die, welche genau dem Namen der Playlist entspricht, den du in deiner Batch angegeben hast.

Auf jedenfall Dnake für deine Mühe,
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 19:34 Uhr
Hallo robcomboy!

Sorry, eine Zeile zuviel weggeworfen ...

01.
Set fso = 
02.
> CreateObject("Scripting.FileSystemObject") 
03.
> BasisPfad = "G:\01\m3u" 
04.
> For Each Datei In 
05.
> fso.GetFolder(BasisPfad).Files 
06.
>     If Right(Datei.Name, 4) = 
07.
> ".m3u" Then 
08.
>         Ordner = Split(Left(Datei.Name, 
09.
> Len(Datei.Name) - 4), "-") 
10.
>         Pfad = BasisPfad 
11.
>         For i = 0 To UBound(Ordner) 
12.
>             Pfad = Pfad & "\" 
13.
> & Trim(Ordner(i)) 
14.
>             If Not fso.FolderExists(Pfad) 
15.
> Then fso.CreateFolder(Pfad) 
16.
>         Next 
17.
>         Datei.Move Pfad & "\" 
18.
>     End If 
19.
> Next 
20.
> WScript.Echo "Fertig." 
21.
> 
Grüße
bastla



Cool, jetzt fluppt es,
Danke schön, Fettes Merci !!!

Kann man was das Prob mit der Startfolder angeht nicht einen Dialog öffnen lassen, in dem ich dann im explorer den Ordner auswähle?
Somit wäre das VBS universell einsetzbar, ohne das ich den Pfad reinkopieren müsste.

Aber nur noch wenn Du magst,
Danke schon mal.
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 19:41 Uhr
ach jetzt versteh ich erst wie Du das genau
haben willst. Dann korrigiere ich mein
Posting zu folgendem:
01.
@echo off 
02.
> for /F "delims=" %%a in (dir /b 
03.
> /A-D *.m3u) do call dodir "%%a" 
04.
> goto ende 
05.
>  
06.
> :dodir 
07.
> for /F "tokens=1-3 delims=- " %%a 
08.
> in (%1) do md "%%a\%%b\%%c" 
09.
> && move %1 "%%a\%%b\%%c" 
10.
> goto eof 
11.
>  
12.
> :ende 
13.
> 
Diese batchdatei legst du einfach in das
Verzeichnis mit deinen Playlists.

miniversum

Also, wenn ich das hier in ne BITCH schreibe, dann funktioniert das leider nicht.
Bitte warten ..
Mitglied: bastla
15.04.2007 um 19:45 Uhr
Hallo miniversum!

Wären dann auch Bindestriche abgedeckt???
UU ein weiteres Problem ... und einen Delimiter aus 3 Zeichen (" - ") kann "for" leider nicht zusammenhängend verarbeiten.

Wenn Du nur nach "-" (und ev wegen des Typs ".m3u") noch nach "." trennst und das dann entstehende Token 4 für die Verzeichniserstellung ignorierst, bleiben immer noch die lästigen Leerstellen nach Artist, vor und nach Album und vor Diskxx - Biber hätte dafür sicher etwas auf Lager, ich müsste mir mit Zwischenvariablen (zB %Album%) und Konstruktionen wie
01.
if "%Album:~0,1%"==" " set "Album=%Album:~1%" 
02.
if "%Album:~-1%"==" " set "Album=%Album:~0,-1%"
etc behelfen.

Grüße
bastla

[Edit] @miniversum: Hatte Deine Edits nicht gesehen ... [/Edit]
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 19:49 Uhr
Ok macht Sinn.
Wären dann auch Bindestriche
abgedeckt???

Ich korrigiere meins dannochmal zu:
<code>@echo off &
enabledelayedexpansion
for /F "delims=" %%a in (dir /b
/A-D *.m3u) do call dodir "%%a"
goto ende

:dodir
for /F "tokens=1-3 delims=-" %%a
in (%1) do (
set "artist=%%a"
set "album=%%b"
set "titel=%%c"
set "artist=%artist:~0,-1%"
set "allbum=%album:~1,-1%"
set "titel=%titel:~1%"
md
"%artist%"\"%album%"\"%titel%"
move %1
"%artist%\%album%\%titel%"
)
goto eof

:ende

miniversum

"Leerzeichen Minus Leerzeichen" trennt im Prinzip die Ordnernamen voneinander.
Leider funktioniert es mit dieser version noch immer nicht, kann auch nicht sehen, weil sich die batch direkt schließt.
wenn ich ne pause einsetze hilft das auch nicht.
Bitte warten ..
Mitglied: bastla
15.04.2007 um 20:57 Uhr
Hallo robcomboy!

Ich mag es ja noch immer nicht wahrhaben, dass die Übergabe eines Pfades nicht klappt, daher vielleicht folgende Variante:
01.
Set fso = CreateObject("Scripting.FileSystemObject") 
02.
If WScript.Arguments.Count >=1 Then 
03.
	If fso.FolderExists(WScript.Arguments(0)) Then BasisPfad = WScript.Arguments(0) 
04.
End If 
05.
If BasisPfad = "" Then 
06.
	Set Verzeichnis = CreateObject("Shell.Application") _ 
07.
        .BrowseForFolder(0, "Datei oder Verzeichnis wählen", 0, 17) 
08.
	If TypeName(Verzeichnis) = "Nothing" Then WScript.Quit(1) 
09.
	Set Basis = Verzeichnis.Self 
10.
	BasisPfad = Basis.Path 
11.
End If 
12.
For Each Datei In fso.GetFolder(BasisPfad).Files 
13.
    If Right(Datei.Name, 4) = ".m3u" Then 
14.
        Ordner = Split(Left(Datei.Name, Len(Datei.Name) - 4), " - ") 
15.
        Pfad = BasisPfad 
16.
        For i = 0 To UBound(Ordner) 
17.
            Pfad = Pfad & "\" & Trim(Ordner(i)) 
18.
            If Not fso.FolderExists(Pfad) Then fso.CreateFolder(Pfad) 
19.
        Next 
20.
        Datei.Move Pfad & "\" 
21.
    End If 
22.
Next 
23.
WScript.Echo "Fertig."
Bei Übergabe eines gültigen Pfades als Argument wird dieser verwendet, im anderen Fall landest Du in einem Verzeichnisauswahldialog.

Grüße
bastla

[Edit] Trennzeichen auf " - " geändert. [/Edit]
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 21:25 Uhr
Hallo robcomboy!

Ich mag es ja noch immer nicht wahrhaben,
dass die Übergabe eines Pfades nicht
klappt, daher vielleicht folgende Variante:
01.
Set fso = 
02.
> CreateObject("Scripting.FileSystemObject") 
03.
> If WScript.Arguments.Count >=1 Then 
04.
> 	If fso.FolderExists(WScript.Arguments(0)) 
05.
> Then BasisPfad = WScript.Arguments(0) 
06.
> End If 
07.
> If BasisPfad = "" Then 
08.
> 	Set Verzeichnis = 
09.
> CreateObject("Shell.Application") 
10.
> _ 
11.
>         .BrowseForFolder(0, "Datei oder 
12.
> Verzeichnis wählen", 0, 17) 
13.
> 	If TypeName(Verzeichnis) = 
14.
> "Nothing" Then WScript.Quit(1) 
15.
> 	Set Basis = Verzeichnis.Self 
16.
> 	BasisPfad = Basis.Path 
17.
> End If 
18.
> For Each Datei In 
19.
> fso.GetFolder(BasisPfad).Files 
20.
>     If Right(Datei.Name, 4) = 
21.
> ".m3u" Then 
22.
>         Ordner = Split(Left(Datei.Name, 
23.
> Len(Datei.Name) - 4), "-") 
24.
>         Pfad = BasisPfad 
25.
>         For i = 0 To UBound(Ordner) 
26.
>             Pfad = Pfad & "\" 
27.
> & Trim(Ordner(i)) 
28.
>             If Not fso.FolderExists(Pfad) 
29.
> Then fso.CreateFolder(Pfad) 
30.
>         Next 
31.
>         Datei.Move Pfad & "\" 
32.
>     End If 
33.
> Next 
34.
> WScript.Echo "Fertig." 
35.
> 
Bei Übergabe eines
gültigen Pfades als Argument wird dieser
verwendet, im anderen Fall landest Du in
einem Verzeichnisauswahldialog.

Grüße
bastla


Super, das Funktioniert jetzt, jetzt kann ich den Ordner auswählen.
Klasse, Danke.
Lässt es sich noch realisieren, dass man in einem Feld den Pfad einfügt, den man in die Zwischablage kopiert hat, so dass dann der genommen wird, wenn man dann keinen Pfad über die Ordnerstruktur gewählt hat?

Danke Dir bastla!!!!
Bitte warten ..
Mitglied: bastla
15.04.2007 um 21:35 Uhr
Hallo robcomboy!

Mein bestes Angebot dafür sieht so aus (bitte ganze Zeile 7 - wegen der Textkorrektur - oder zumindest in dieser Zeile 0 durch 16 ersetzen):
01.
        .BrowseForFolder(0, "Verzeichnis wählen", <b>16</b>, 17)
Grüße
bastla
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 22:03 Uhr
Hallo robcomboy!

Mein bestes Angebot dafür sieht so aus
(bitte ganze Zeile 7 - wegen der
Textkorrektur - oder zumindest in dieser
Zeile 0 durch 16 ersetzen):
01.
        .BrowseForFolder(0, 
02.
> "Verzeichnis wählen", 
03.
> <b>16</b>, 17) 
04.
> 
Grüße
bastla

Hallo Bastla, Danke das Funktioniert jetzt auch.
Auf jeden Fall vielen Dank für deine Arbeit und Mühe die Du dir gemacht hast.
Du hast mir sehr viel Zeit erspart.
Wenn ich Irgendwie helfen kann, schreib mich an, ich tu mein Bestes.

Übrigens, mir ist noch eine Idee eingefallen, wie man das Script noch universeller gestalten könnte. Wäre es mögich ein Feld zu definieren, in das man dann die Dateiendungen einträgt, welche bei der ganzen Aktion berücksichtigt werden sollen? Damit lönnte man dann auch mal eben seinen DL ordner aufräumen, diese Dateien habe ich nämlich ähnlich benannt und einmal Script laufen lassen und schon ist alles in den entsprechenden Ordnern einsortiert.

Diese Funktion muss natürlich nicht,
Nur wenn Du noch Bock hast.
Auf jeden Fall vielen Dank,
Wenn wir uns nicht mhr "hören" Dir noch ein schönes WE.

Grüße, robcomboy
Bitte warten ..
Mitglied: bastla
15.04.2007 um 22:30 Uhr
Hallo robcomboy!

"Feld" definieren ist bei VBS so eine Sache für sich, da nur in Ansätzen eine GUI vorhanden ist (für Eingaben zB eine InputBox() oder eben ein Dialog wie die Ordnerauswahl). Umso mehr stört mich, dass die Übergabe von Argumenten bei Dir nicht funktioniert.

Für den Dateityp wird's eine InputBox tun (müssen) - daher Endfassung:
01.
'OrdnerStrukturErzeugen.vbs 
02.
'Argumente: [BasisPfad] [DateiTyp] 
03.
Set fso = CreateObject("Scripting.FileSystemObject") 
04.
If WScript.Arguments.Count >=1 Then 
05.
	If fso.FolderExists(WScript.Arguments(0)) Then BasisPfad = WScript.Arguments(0) 
06.
End If 
07.
If BasisPfad = "" Then 
08.
	Set Verzeichnis = CreateObject("Shell.Application") _ 
09.
        .BrowseForFolder(0, "Datei oder Verzeichnis wählen", 16, 17) 
10.
	If TypeName(Verzeichnis) = "Nothing" Then WScript.Quit(1) 
11.
	Set Basis = Verzeichnis.Self 
12.
	BasisPfad = Basis.Path 
13.
End If 
14.
If WScript.Arguments.Count >=2 Then 
15.
	DateiTyp = WScript.Arguments(1) 
16.
Else 
17.
	DateiTyp = InputBox("Gesuchten Dateityp eingeben!", "Typ?", "m3u") 
18.
	If DateiTyp = "" Then WScript.Quit(1) 
19.
End If 
20.
DateiTyp = LCase(DateiTyp) 
21.
If Left(DateiTyp, 1) <> "." Then DateiTyp = "." & DateiTyp 
22.
For Each Datei In fso.GetFolder(BasisPfad).Files 
23.
	Typ = LCase(Mid(Datei.Name, InstrRev(Datei.Name, "."))) 
24.
    If Typ = DateiTyp Then 
25.
        Ordner = Split(Left(Datei.Name, Len(Datei.Name) - Len(Typ)), "-") 
26.
        Pfad = BasisPfad 
27.
        For i = 0 To UBound(Ordner) 
28.
            Pfad = Pfad & "\" & Trim(Ordner(i)) 
29.
            If Not fso.FolderExists(Pfad) Then fso.CreateFolder(Pfad) 
30.
        Next 
31.
        Datei.Move Pfad & "\" 
32.
    End If 
33.
Next 
34.
WScript.Echo "Fertig."
Wenn übrigens sichergestellt ist, dass die Trennung immer in der Form " - ", also jeweils mit Leerstellen vor und hinter dem "-", erfolgt, könnte man dies in der Zeile "Ordner = ..." für das Splitten berücksichtigen - dadurch wären dann auch Namen mit enthaltenem "-" korrekt zu verarbeiten ...

Offen bleibt noch zumindest eine Fehlerbehandlung bei bereits existierenden Dateien im Zielverzeichnis.

Grüße
bastla
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 23:11 Uhr
Hallo robcomboy!

>Umsomehr stört mich, dass die Übergabe
von Argumenten bei Dir nicht funktioniert.
Wie meinst Du das? Was verstehst du unter Argumenten?

wenn übrigens sichergestellt ist, dass die Trennung immer
in der Form " - ", also jeweils mit
Leerstellen vor und hinter dem "-",
erfolgt, könnte man dies in der Zeile
"Ordner = ..." für das
Splitten berücksichtigen.
Das ist sichergestellt. die Trennung ist immer in dieser Form.
Was meinst DU mit "für das
Splitten berücksichtigen.
"


dadurch wären dann auch Namen mit enthaltenem
"-" korrekt zu verarbeiten ...

Läßt sich das realisieren?

Offen bleibt noch zumindest eine
Fehlerbehandlung bei bereits existierenden
Dateien im Zielverzeichnis.

Ansatz wäre hier existierenden umzubenennen.

Grüße, robcomboy
Bitte warten ..
Mitglied: bastla
15.04.2007 um 23:21 Uhr
Hallo robcomboy!

Mit "Argumenten" meinte ich "Parameter", also die Übergabe von Pfad und Dateityp beim Aufruf von der Commandline (wird vom Script unterstützt, scheint aber - mir nicht erklärlich - bei Dir nicht zu funktionieren, siehe oben ...).
Hinsichtlich der "-": Ersetze die entsprechende Zeile durch:
01.
        Ordner = Split(Left(Datei.Name, Len(Datei.Name) - Len(Typ)), " - ")
In dieser Zeile wird der Dateiname mit der "Split()"-Funktion in Ordnerebenen (Artist\Album\Diskxx) aufgeteilt.
Bereits vorhandene Dateien:
Ansatz wäre hier existierenden umzubenennen.
Dazu müsstest Du Dir eine Vorgabe überlegen ...

Grüße
bastla

... der heute sicher nix mehr umbenennt ...
Bitte warten ..
Mitglied: robcomboy
15.04.2007 um 23:32 Uhr
Hallo robcomboy!

Mit "Argumenten" meinte ich
"Parameter", also die Übergabe
von Pfad und Dateityp beim Aufruf von der
Commandline (wird vom Script
unterstützt, scheint aber - mir nicht
erklärlich - bei Dir nicht zu
funktionieren, siehe oben ...).
Hinsichtlich der "-": Ersetze die
entsprechende Zeile durch:
01.
        Ordner = 
02.
> Split(Left(Datei.Name, Len(Datei.Name) - 
03.
> Len(Typ)), " - ") 
04.
> 
In dieser Zeile wird der
Dateiname mit der
"Split()"-Funktion in Ordnerebenen
(Artist\Album\Diskxx) aufgeteilt.
Bereits vorhandene Dateien:
> Ansatz wäre hier existierenden
umzubenennen.
Dazu müsstest Du Dir eine Vorgabe
überlegen ...

Grüße
bastla

... der heute sicher nix mehr umbenennt
...




Danke Bastla, ich seh dann morgen danach.
Gruß, robcomboy
Bitte warten ..
Mitglied: Biber
16.04.2007 um 00:51 Uhr
Hallo robcomboy, bastla und miniversum,

wenn diese Playlist-Erstellungs-Lösung hier zu Ende ausgefeilt ist, würde ich dann gerne mit Euch gemeinsam je eine Batch und eine VBSkript-Lösung (und meinetwegen noch eine als Kontext-im-Explorer-Lösung als Draufgabe) als Tutorial in den Bereich "Batch & Shell" stellen.

Bitte lasst uns dazu in den nächsten Tagen, wenn hier der letzte Feinschliff fertig ist, mal ein paar PNs austauschen.
Ich sichte mal unterdessen die bereits vorhandenen Lösungen/Antworten bei ähnlichen Playlist-Anforderungen.

Würde mich freuen, wenn es klappt.

@robcomboy
Es heißt definitiv "Batch & Shell", nicht "Bitch & sHell" ..*ggg

Grüsse
Biber
Bitte warten ..
Mitglied: miniversum
16.04.2007 um 11:01 Uhr
So nach ein paar Stunden Schlaf und nem Kaffee hab ich jetzt die Batch zum laufen gebracht und getestet.
01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
for /F "delims=" %%a in ('dir /b /A-D *.m3u') do call:dodir "%%a" 
04.
goto ende 
05.
 
06.
:dodir 
07.
 
08.
for /F "delims=" %%a in (%1) do set "file=%%~na" 
09.
for /F "tokens=1-3 delims=-" %%a in ("%file%") do ( 
10.
 
11.
set "myartist=%%a" 
12.
set "myalbum=%%b" 
13.
set "mytitel=%%c" 
14.
 
15.
md "!myartist:~0,-1!\!myalbum:~1,-1!\!mytitel:~1!" 
16.
move %1 "!myartist:~0,-1!\!myalbum:~1,-1!\!mytitel:~1!" 
17.
18.
goto ende 
19.
 
20.
:ende
Liegt diese im Verzeichnis mit den Playlists werde alle nach einander umgewandelt.

miniversum
Bitte warten ..
Mitglied: robcomboy
16.04.2007 um 23:04 Uhr
Hallo robcomboy, bastla und miniversum,

wenn diese Playlist-Erstellungs-Lösung
hier zu Ende ausgefeilt ist, würde ich
dann gerne mit Euch gemeinsam je eine Batch
und eine VBSkript-Lösung (und
meinetwegen noch eine als
Kontext-im-Explorer-Lösung als
Draufgabe) als Tutorial in
den Bereich "Batch & Shell"
stellen.

Bitte lasst uns dazu in den nächsten
Tagen, wenn hier der letzte Feinschliff
fertig ist, mal ein paar PNs austauschen.
Ich sichte mal unterdessen die bereits
vorhandenen Lösungen/Antworten bei
ähnlichen Playlist-Anforderungen.

Würde mich freuen, wenn es klappt.

@robcomboy
Es heißt definitiv "Batch &
Shell", nicht "Bitch &
sHell" ..*ggg

Grüsse
Biber

Hallo Biber, deine Idee finde ich schön, vor allem die Integration ins Kontextmenü ist genial.
ich fände es natürlich gut, wenn man das realisieren könnte.
Wobei ich dazusaen muss, dass ich mich leider am geschehen, was das programmieren angeht
nicht aktiv beteiligen kann, da ich weder batch noch vbs programmieren kann.
Eine Idee wäre zum Beispiel einen Beitrag aufzumachen, in dem für diese Batcg und das VBS Ideen gesammelt werden, was das Ding alles können soll und was es für funktionen haben soll.

Bin gespannt auf deine Antwort.
Grüße, robcomboy
Bitte warten ..
Mitglied: robcomboy
16.04.2007 um 23:11 Uhr
So nach ein paar Stunden Schlaf und nem
Kaffee hab ich jetzt die Batch zum laufen
gebracht und getestet.
01.
@echo off & setlocal 
02.
> enabledelayedexpansion 
03.
>  
04.
> for /F "delims=" %%a in ('dir 
05.
> /b /A-D *.m3u') do call:dodir 
06.
> "%%a" 
07.
> goto ende 
08.
>  
09.
> :dodir 
10.
>  
11.
> for /F "delims=" %%a in (%1) do 
12.
> set "file=%%~na" 
13.
> for /F "tokens=1-3 delims=-" %%a 
14.
> in ("%file%") do ( 
15.
>  
16.
> set "myartist=%%a" 
17.
> set "myalbum=%%b" 
18.
> set "mytitel=%%c" 
19.
>  
20.
> md 
21.
> "!myartist:~0,-1!\!myalbum:~1,-1!\!mytitel:~1!" 
22.
> move %1 
23.
> "!myartist:~0,-1!\!myalbum:~1,-1!\!mytitel:~1!" 
24.
> ) 
25.
> goto ende 
26.
>  
27.
> :ende 
28.
> 
Liegt diese im Verzeichnis mit den Playlists
werde alle nach einander umgewandelt.

miniversum

Hallo Miniversum:

Danke für die Batch.
Ich habe sie ausprobiert.

Bei mir ist es so, dass die Batch den Ordner erstellt, aber dabei den letzten Buchstaben des Ordnernamens weglässt.
Das ist wahrscheinlich dann auch der Grund dafür, warm die Dateien nicht in den erstellten Ordner kopiert werden.

Grüße, robcomboy
Bitte warten ..
Mitglied: miniversum
17.04.2007 um 09:06 Uhr
Ich habs gerade eben mit allen möglichen Kombintionen getestet.
Eben immer die Kombination mit " - " getrennt.
Bei mir gehts.
Fehlt bei jedem Ordner der letzte Buchstabe oder nur bei einem der drei Ordner?

miniversum
Bitte warten ..
Mitglied: robcomboy
17.04.2007 um 09:35 Uhr
es fehlt bei jedem der letzte buchstabe.
Bitte warten ..
Mitglied: miniversum
17.04.2007 um 09:43 Uhr
01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
for /F "delims=" %%a in ('dir /b /A-D *.m3u') do call:dodir "%%a" 
04.
goto ende 
05.
 
06.
:dodir 
07.
 
08.
for /F "delims=" %%a in (%1) do set "file=%%~na" 
09.
for /F "tokens=1-3 delims=-" %%a in ("%file%") do ( 
10.
 
11.
set "myartist=%%a" 
12.
set "myalbum=%%b" 
13.
set "mytitel=%%c" 
14.
 
15.
echo Playlist=[%1]>>Log.txt 
16.
echo Artist=[!myartist:~0,-1!]>>Log.txt 
17.
echo Album=[!myalbum:~1,-1!]>>Log.txt 
18.
echo Titel=[!mytitel:~1!]>>Log.txt 
19.
echo.>>Log.txt 
20.
 
21.
md "!myartist:~0,-1!\!myalbum:~1,-1!\!mytitel:~1!" 
22.
move %1 "!myartist:~0,-1!\!myalbum:~1,-1!\!mytitel:~1!" 
23.
24.
goto ende 
25.
 
26.
:ende
Lass diese mal laufen. Dabei wir wird dir eine Datei log.txt erstellt. Poste mal bitte diese log.txt (zumindest auszugsweise)

miniversum
Bitte warten ..
Mitglied: robcomboy
17.04.2007 um 10:04 Uhr
01.
@echo off & setlocal 
02.
> enabledelayedexpansion 
03.
>  
04.
> for /F "delims=" %%a in ('dir 
05.
> /b /A-D *.m3u') do call:dodir 
06.
> "%%a" 
07.
> goto ende 
08.
>  
09.
> :dodir 
10.
>  
11.
> for /F "delims=" %%a in (%1) do 
12.
> set "file=%%~na" 
13.
> for /F "tokens=1-3 delims=-" %%a 
14.
> in ("%file%") do ( 
15.
>  
16.
> set "myartist=%%a" 
17.
> set "myalbum=%%b" 
18.
> set "mytitel=%%c" 
19.
>  
20.
> echo Playlist=[%1]>>Log.txt 
21.
> echo 
22.
> Artist=[!myartist:~0,-1!]>>Log.txt 
23.
> echo Album=[!myalbum:~1,-1!]>>Log.txt 
24.
> echo Titel=[!mytitel:~1!]>>Log.txt 
25.
> echo.>>Log.txt 
26.
>  
27.
> md 
28.
> "!myartist:~0,-1!\!myalbum:~1,-1!\!mytitel:~1!" 
29.
> move %1 
30.
> "!myartist:~0,-1!\!myalbum:~1,-1!\!mytitel:~1!" 
31.
> ) 
32.
> goto ende 
33.
>  
34.
> :ende 
35.
> 
Lass diese mal laufen. Dabei wir wird dir
eine Datei log.txt erstellt. Poste mal bitte
diese log.txt (zumindest auszugsweise)

miniversum

Schein geklappt zu haben:

Hier die Log Datei.

[code]
Playlist=["Kopie von test - test1 - test2 - test3.m3u"]
Artist=[Kopie von test]
Album=[test1]
Titel=[test2 ]

Playlist=["test - test1 - test2 - test3.m3u"]
Artist=[test]
Album=[test1]
Titel=[test2 ]
[/code]


Jetzt habe ich aber noch eine Frage,
anhand deiner Logdatei und der Zuordnung,

Was wäre, wenn die Playlist so heißen würde:
"Kopie von test - test1 - test2 - test3 - test4.m3u"

Weil, Artist Album und Titel kann man doch nur einmal vergeben, oder?

Grüße, robcomboy
Bitte warten ..
Mitglied: miniversum
17.04.2007 um 11:00 Uhr
in deinem Eingangsposting meintest du noch das die Playlist ein Format von "test - test1 - test2.m3u" hat also drei Elemente nicht vier wie du sie jetzt getestet hast ("test - test1 - test2 - test3.m3u"). Meine Batch nimmt nur die ersten drei Elemente. Der rest dahinter fällt weg. Oder willst du das ganze jetzt mit vier?

Verwendest du also eine Playlist mit dem Namen "Kopie von test - test1 - test2 - test3 - test4.m3u" werden die Ordner so angelegt:
Kopie von test
test1
test2

miniversum
Bitte warten ..
Mitglied: bastla
17.04.2007 um 11:32 Uhr
Hallo robcomboy!

Was wäre, wenn die Playlist so heißen würde:
"Kopie von test - test1 - test2 - test3 - test4.m3u"
Dann hättest du die von Dir vorgegebene Konvention nicht eingehalten und müsstest zunächst einmal festlegen,
  • ob daraus 5 Ordnerebenen entstehen sollen (wie es das VB-Script oben machen würde) oder
  • welche der Teilbestandteile (nach welchen Kriterien) zusammengefasst werden sollten.

Grüße
bastla
Bitte warten ..
Mitglied: robcomboy
17.04.2007 um 11:33 Uhr
in deinem Eingangsposting meintest du noch
das die Playlist ein Format von "test -
test1 - test2.m3u" hat also drei
Elemente nicht vier wie du sie jetzt getestet
hast ("test - test1 - test2 -
test3.m3u"). Meine Batch nimmt nur die
ersten drei Elemente. Der rest dahinter
fällt weg. Oder willst du das ganze
jetzt mit vier?

Verwendest du also eine Playlist mit dem
Namen "Kopie von test - test1 - test2 -
test3 - test4.m3u" werden die Ordner so
angelegt:
> Kopie von test
> test1
> test2

miniversum


Ah, OK.

Verstehe, ja am Anfang habe ich das so geschrieben.
doch manchmal kommt es auch vor, dass die Playlist, wenn es ein Spezial auf der cd gibt, die unbedingt in die Bennenung mit rein soll, länger als die 3 Platzhalter werden kann.
Für eben diesen Fall, würde das dann nicht funktionieren.
Im Verlauf der ganzen Angelegenheit hier, habe ich dann mehr und mehr eine uiversal Lösung im Kopf gehabt, die agel wie lang die Playlisten oder in der erweiterten Form anderen Dateinamen sind, dass aus ihnen die entsprechende Struktur erstellt wird.

Primär war die Idee die Playlisten umzuwandeln.

Grüße, robcomboy
Bitte warten ..
Mitglied: robcomboy
17.04.2007 um 11:43 Uhr
Hallo robcomboy!

> Was wäre, wenn die Playlist so
heißen würde:
> "Kopie von test - test1 - test2 -
test3 - test4.m3u"
Dann hättest du die von Dir
vorgegebene Konvention nicht eingehalten und
müsstest zunächst einmal
festlegen,
  • ob daraus 5 Ordnerebenen entstehen sollen
(wie es das VB-Script oben machen würde)
oder
  • welche der Teilbestandteile (nach welchen
Kriterien) zusammengefasst werden sollten.

Grüße
bastla

Okay, hab das Prob verstanden.

Es sollen also genau so viele Ordnerebenen erstellt werden wie
Trennzeichen [" - " +1] vorhanden sind.

Das Trennzeichen wäre immer " - ".
Angewandt auf das Beispiel:

"Kopie von test - test1 - test2 - test3 - test4.m3u"

Insgesamt 5 Ordner, wobei im ersten Ordnen dann die Unterordnerstruktur test1 bis test 4 liegt.
Ich hoffe ich hab das jetzt verständlich erklärt. Wenn noch was unklar sein sollte, bitte noch mal melden.

Grüße, robcomboy
Bitte warten ..
Mitglied: bastla
17.04.2007, aktualisiert 18.10.2012
Hallo robcomboy!

Hast Du das schon versucht (vielleicht sogar mit einem Aufruf der folgenden Art)?
01.
OrdnerStrukturErzeugen.vbs D:\StartOrdner m3u
Grüße
bastla
Bitte warten ..
Mitglied: robcomboy
17.04.2007, aktualisiert 18.10.2012
Hallo robcomboy!

Hast Du
[http://www.administrator.de/forum/ordnerstruktur-aus-dateinamen-erstellen-56675.html#comment-227915
das] schon versucht (vielleicht sogar mit
einem Aufruf der folgenden Art)?
01.
OrdnerStrukturErzeugen.vbs 
02.
> D:\StartOrdner m3u 
03.
> 
Grüße
bastla

Hallo Bastla,

Mit der Version funktioniert es wunderbar, ich habe eben mal eine Playlist
mit 7 unterverzeichnissen angelegt. Es hat funktioniert.

Der Aufruf des VBS mit Übergabe des Pfades hat weder mit noch ohne "" via cmd funktioniert.
ist nicht schlimm, man kann den Pfad ja auch über die Zwischenablage einfügen, in die dafür vorgesehene Zeile.

Gruß, und Dank, robcomboy


Noch ein Nachtrag,
Jetzt hab ich das gerallt.
Startordner war der Pfad und m3u die extension die berücksichtigt werden soll.
damit hat es auch nicht funktioniert.
Aber auch wenn ich das dann so mache, mit "" funktioniert es nicht.
Bitte warten ..
Mitglied: miniversum
17.04.2007 um 17:36 Uhr
So jetzt mal die kurze Batch Lösung die nur auf " - " reagiert und mehrere Verzeichnistiefen kann:
01.
@echo off 
02.
 
03.
for /F "delims=" %%a in ('dir /b /A-D *.m3u') do call:dodir "%%~na" 
04.
goto ende 
05.
 
06.
:dodir 
07.
set "file=%1" 
08.
set fulldir="%file: - =\%" 
09.
md %fulldir% 
10.
move %1 %fulldir% 
11.
goto ende 
12.
 
13.
:ende
miniversum

PS: so einfach lass ich das mit dem vbs ja nicht auf mir sitzen hehe
Bitte warten ..
Mitglied: bastla
17.04.2007 um 18:31 Uhr
@miniversum

Das mit dem Ersetzen ist ein gute Idee.

Den Rest würde ich vielleicht eher so schreiben (dann klappt's auch mit dem "move" und mit dazwischengestreuten Leerstellen):
01.
@echo off 
02.
 
03.
for /F "delims=" %%a in ('dir /b /A-D *.m3u') do call:dodir "%%a" 
04.
goto :eof 
05.
 
06.
:dodir 
07.
set "file=%~n1" 
08.
set "fulldir=%file: - =\%" 
09.
md "%fulldir%" 
10.
move %1 "%fulldir%"
Grüße
bastla
Bitte warten ..
Mitglied: robcomboy
17.04.2007 um 20:39 Uhr
So jetzt mal die kurze Batch Lösung die
nur auf " - " reagiert und mehrere
Verzeichnistiefen kann:
01.
> @echo off 
02.
>  
03.
> for /F "delims=" %%a in ('dir 
04.
> /b /A-D *.m3u') do call:dodir 
05.
> "%%~na" 
06.
> goto ende 
07.
>  
08.
> :dodir 
09.
> set "file=%1" 
10.
> set fulldir="%file: - =\%" 
11.
> md %fulldir% 
12.
> move %1 %fulldir% 
13.
> goto ende 
14.
>  
15.
> :ende 
16.
> 
miniversum

PS: so einfach lass ich das mit dem vbs ja
nicht auf mir sitzen hehe


Diese Batch erstellt aus dem Beispiel
"dir 1 - dir2 - dir3 - dir4 - dir5 - dir6 - dir7 - dir8.m3u"

einen Ordner 1 und einen Ordner Dir im Verzeichnis wo ich die Batch ausführe.
ich denke das liegt am Leerzeichen zwischen dir und 1.
Im Ordner 1 werden den die Unterordner entsprechend angelegt. dir 2 bis dir8.

Das ich das festgestellt hab, war wohl eher zufällig.

Grüße, robcomboy
Bitte warten ..
Mitglied: robcomboy
17.04.2007 um 20:46 Uhr
So jetzt mal die kurze Batch Lösung die
nur auf " - " reagiert und mehrere
Verzeichnistiefen kann:
01.
> @echo off 
02.
>  
03.
> for /F "delims=" %%a in ('dir 
04.
> /b /A-D *.m3u') do call:dodir 
05.
> "%%~na" 
06.
> goto ende 
07.
>  
08.
> :dodir 
09.
> set "file=%1" 
10.
> set fulldir="%file: - =\%" 
11.
> md %fulldir% 
12.
> move %1 %fulldir% 
13.
> goto ende 
14.
>  
15.
> :ende 
16.
> 
miniversum

PS: so einfach lass ich das mit dem vbs ja
nicht auf mir sitzen hehe

Die hier funktioniert.

Gruß, robcomboy
Bitte warten ..
Mitglied: 45753
19.04.2007 um 18:43 Uhr
Hallo robcomboy,

bastla gab mir sein ok und hat mir noch ein paar tips gegeben...

Hier hast du nun das Script, in dem du jetzt per Abfrage gleich mehrere Trennzeichen definieren kannst + die Dateiendung.

In dem ersten Script sin d die Infos von bastla mit drin - mit "setlocal enabledelayedexpansion"
Ich hatte auch schon versucht das so hinzubiegen, nur hatte ich die ! nicht gesetzt...

01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
cls 
04.
 
05.
:abfrageanfang 
06.
 
07.
echo \\\                               -I-N-F-O-S-                               /// 
08.
echo -==/==========================================================================- 
09.
ECHO  .. Angaben zur Dateiendung 
10.
echo -==/==========================================================================- 
11.
echo. 
12.
set /p dateiendung= == Dateiendung mit Punkt angeben:  
13.
cls 
14.
echo \\\                               -I-N-F-O-S-                               /// 
15.
echo -==/==========================================================================- 
16.
ECHO  .. Angaben zu Trennungszeichen 
17.
echo -==/==========================================================================- 
18.
echo -==/==========================================================================- 
19.
ECHO  .. -Trennungszeichen von der laengsten zur kuerzesten Zeichenkette angeben. 
20.
ECHO  .. -Mit ENTER wird Abfrage abgebrochen und bisherige Eingaben ausgefuehrt. 
21.
echo -==/==========================================================================- 
22.
echo. 
23.
set /p fulldir1_choice= == Trennungszeichen [1/9]:  
24.
if "%fulldir1_choice%" == "" goto abfrageende 
25.
set /p fulldir2_choice= == Trennungszeichen [2/9]:  
26.
if "%fulldir2_choice%" == "" goto abfrageende 
27.
set /p fulldir3_choice= == Trennungszeichen [3/9]:  
28.
if "%fulldir3_choice%" == "" goto abfrageende 
29.
set /p fulldir4_choice= == Trennungszeichen [4/9]:  
30.
if "%fulldir4_choice%" == "" goto abfrageende 
31.
set /p fulldir5_choice= == Trennungszeichen [5/9]:  
32.
if "%fulldir5_choice%" == "" goto abfrageende 
33.
set /p fulldir6_choice= == Trennungszeichen [6/9]:  
34.
if "%fulldir6_choice%" == "" goto abfrageende 
35.
set /p fulldir7_choice= == Trennungszeichen [7/9]:  
36.
if "%fulldir7_choice%" == "" goto abfrageende 
37.
set /p fulldir8_choice= == Trennungszeichen [8/9]:  
38.
if "%fulldir8_choice%" == "" goto abfrageende 
39.
set /p fulldir9_choice= == Trennungszeichen [9/9]:  
40.
if "%fulldir9_choice%" == "" goto abfrageende 
41.
 
42.
:abgeschlossen 
43.
 
44.
cls 
45.
echo. 
46.
echo -==/==========================================================================- 
47.
ECHO  .. Ausfuehrung der Operation 
48.
echo -==/==========================================================================- 
49.
echo. 
50.
echo  == Operation abgeschlossen. 
51.
echo. 
52.
pause 
53.
 
54.
goto :eof 
55.
 
56.
:abfrageende 
57.
 
58.
cls 
59.
echo. 
60.
echo -==/==========================================================================- 
61.
ECHO  .. Ausfuehrung der Operation 
62.
echo -==/==========================================================================- 
63.
echo. 
64.
echo  == wait... 
65.
echo. 
66.
 
67.
if "%fulldir1_choice%" == "" set fulldir1_choice="" 
68.
if "%fulldir2_choice%" == "" set fulldir2_choice="" 
69.
if "%fulldir3_choice%" == "" set fulldir3_choice="" 
70.
if "%fulldir4_choice%" == "" set fulldir4_choice="" 
71.
if "%fulldir5_choice%" == "" set fulldir5_choice="" 
72.
if "%fulldir6_choice%" == "" set fulldir6_choice="" 
73.
if "%fulldir7_choice%" == "" set fulldir7_choice="" 
74.
if "%fulldir8_choice%" == "" set fulldir8_choice="" 
75.
if "%fulldir9_choice%" == "" set fulldir9_choice="" 
76.
 
77.
for /F "delims=" %%a in ('dir /b /A-D *%dateiendung%') do call:dodir "%%a" 
78.
goto :abgeschlossen 
79.
 
80.
:dodir 
81.
 
82.
set "fulldir0=%~n1" 
83.
set "fulldir1=!fulldir0:%fulldir1_choice%=\!" 
84.
 
85.
set "fulldir2=%fulldir1%" 
86.
set "fulldir2=!fulldir1:%fulldir2_choice%=\!" 
87.
 
88.
set "fulldir3=%fulldir2%" 
89.
set "fulldir3=!fulldir2:%fulldir3_choice%=\!" 
90.
 
91.
set "fulldir4=%fulldir3%" 
92.
set "fulldir4=!fulldir3:%fulldir4_choice%=\!" 
93.
 
94.
set "fulldir5=%fulldir4%" 
95.
set "fulldir5=!fulldir4:%fulldir5_choice%=\!" 
96.
 
97.
set "fulldir6=%fulldir5%" 
98.
set "fulldir6=!fulldir5:%fulldir6_choice%=\!" 
99.
 
100.
set "fulldir7=%fulldir6%" 
101.
set "fulldir7=!fulldir6:%fulldir7_choice%=\!" 
102.
 
103.
set "fulldir8=%fulldir7%%" 
104.
set "fulldir8=!fulldir7:%fulldir8_choice%=\!" 
105.
 
106.
set "fulldir9=%fulldir8%" 
107.
set "fulldir9=!fulldir8:%fulldir9_choice%=\!" 
108.
 
109.
md "%fulldir9%" 
110.
move %1 "%fulldir9%" 
111.
 
112.
:eof
Hier nun mein Script ohne delayedexpansion

01.
@echo off 
02.
cls 
03.
 
04.
:abfrageanfang 
05.
 
06.
echo \\\                               -I-N-F-O-S-                               /// 
07.
echo -==/==========================================================================- 
08.
ECHO  .. Angaben zur Dateiendung 
09.
echo -==/==========================================================================- 
10.
echo. 
11.
set /p dateiendung= == Dateiendung mit Punkt angeben:  
12.
cls 
13.
echo \\\                               -I-N-F-O-S-                               /// 
14.
echo -==/==========================================================================- 
15.
ECHO  .. Angaben zu Trennungszeichen 
16.
echo -==/==========================================================================- 
17.
echo -==/==========================================================================- 
18.
ECHO  .. -Trennungszeichen von der laengsten zur kuerzesten Zeichenkette angeben. 
19.
ECHO  .. -Mit ENTER wird Abfrage abgebrochen und bisherige Eingaben ausgefuehrt. 
20.
echo -==/==========================================================================- 
21.
echo. 
22.
set /p fulldir1_choice= == Trennungszeichen [1/9]:  
23.
if "%fulldir1_choice%" == "" goto abfrageende 
24.
set /p fulldir2_choice= == Trennungszeichen [2/9]:  
25.
if "%fulldir2_choice%" == "" goto abfrageende 
26.
set /p fulldir3_choice= == Trennungszeichen [3/9]:  
27.
if "%fulldir3_choice%" == "" goto abfrageende 
28.
set /p fulldir4_choice= == Trennungszeichen [4/9]:  
29.
if "%fulldir4_choice%" == "" goto abfrageende 
30.
set /p fulldir5_choice= == Trennungszeichen [5/9]:  
31.
if "%fulldir5_choice%" == "" goto abfrageende 
32.
set /p fulldir6_choice= == Trennungszeichen [6/9]:  
33.
if "%fulldir6_choice%" == "" goto abfrageende 
34.
set /p fulldir7_choice= == Trennungszeichen [7/9]:  
35.
if "%fulldir7_choice%" == "" goto abfrageende 
36.
set /p fulldir8_choice= == Trennungszeichen [8/9]:  
37.
if "%fulldir8_choice%" == "" goto abfrageende 
38.
set /p fulldir9_choice= == Trennungszeichen [9/9]:  
39.
if "%fulldir9_choice%" == "" goto abfrageende 
40.
 
41.
:abfrageende 
42.
 
43.
cls 
44.
echo. 
45.
echo -==/==========================================================================- 
46.
ECHO  .. Ausfuehrung der Operation 
47.
echo -==/==========================================================================- 
48.
echo. 
49.
echo  == wait... 
50.
echo. 
51.
 
52.
if "%fulldir1_choice%" == "" set fulldir1_choice="" 
53.
if "%fulldir2_choice%" == "" set fulldir2_choice="" 
54.
if "%fulldir3_choice%" == "" set fulldir3_choice="" 
55.
if "%fulldir4_choice%" == "" set fulldir4_choice="" 
56.
if "%fulldir5_choice%" == "" set fulldir5_choice="" 
57.
if "%fulldir6_choice%" == "" set fulldir6_choice="" 
58.
if "%fulldir7_choice%" == "" set fulldir7_choice="" 
59.
if "%fulldir8_choice%" == "" set fulldir8_choice="" 
60.
if "%fulldir9_choice%" == "" set fulldir9_choice="" 
61.
 
62.
:: --- 
63.
 
64.
set ordnerstruktur_var=Ordnerstruktur.aus.Dateinamen.erstellen_exec.bat 
65.
del /f /q  %ordnerstruktur_var% 2>Nul 
66.
 
67.
echo @echo off>%ordnerstruktur_var% 
68.
echo cls>>%ordnerstruktur_var% 
69.
 
70.
echo for /F "delims=" %%%%a in ('dir /b /A-D *%dateiendung%') do call:dodir "%%%%a">>%ordnerstruktur_var% 
71.
echo exit>>%ordnerstruktur_var% 
72.
 
73.
echo :dodir>>%ordnerstruktur_var% 
74.
 
75.
echo set "fulldir0=%%~n1">>%ordnerstruktur_var% 
76.
echo set "fulldir1=%%fulldir0:%fulldir1_choice%=\%%">>%ordnerstruktur_var% 
77.
 
78.
echo set "fulldir2=%%fulldir1%%">>%ordnerstruktur_var% 
79.
echo set "fulldir2=%%fulldir1:%fulldir2_choice%=\%%">>%ordnerstruktur_var% 
80.
 
81.
echo set "fulldir3=%%fulldir2%%">>%ordnerstruktur_var% 
82.
echo set "fulldir3=%%fulldir2:%fulldir3_choice%=\%%">>%ordnerstruktur_var% 
83.
 
84.
echo set "fulldir4=%%fulldir3%%">>%ordnerstruktur_var% 
85.
echo set "fulldir4=%%fulldir3:%fulldir4_choice%=\%%">>%ordnerstruktur_var% 
86.
 
87.
echo set "fulldir5=%%fulldir4%%">>%ordnerstruktur_var% 
88.
echo set "fulldir5=%%fulldir4:%fulldir5_choice%=\%%">>%ordnerstruktur_var% 
89.
 
90.
echo set "fulldir6=%%fulldir5%%">>%ordnerstruktur_var% 
91.
echo set "fulldir6=%%fulldir5:%fulldir6_choice%=\%%">>%ordnerstruktur_var% 
92.
 
93.
echo set "fulldir7=%%fulldir6%%">>%ordnerstruktur_var% 
94.
echo set "fulldir7=%%fulldir6:%fulldir7_choice%=\%%">>%ordnerstruktur_var% 
95.
 
96.
echo set "fulldir8=%%fulldir7%%">>%ordnerstruktur_var% 
97.
echo set "fulldir8=%%fulldir7:%fulldir8_choice%=\%%">>%ordnerstruktur_var% 
98.
 
99.
echo set "fulldir9=%%fulldir8%%">>%ordnerstruktur_var% 
100.
echo set "fulldir9=%%fulldir8:%fulldir9_choice%=\%%">>%ordnerstruktur_var% 
101.
 
102.
echo :dodirend>>%ordnerstruktur_var% 
103.
 
104.
echo md "%%fulldir9%%">>%ordnerstruktur_var% 
105.
echo move %%1 "%%fulldir9%%">>%ordnerstruktur_var% 
106.
 
107.
start /B /wait %ordnerstruktur_var% 
108.
 
109.
:: --- 
110.
 
111.
del /f /q  %ordnerstruktur_var% 2>Nul 
112.
 
113.
cls 
114.
echo. 
115.
echo -==/==========================================================================- 
116.
ECHO  .. Ausfuehrung der Operation 
117.
echo -==/==========================================================================- 
118.
echo. 
119.
echo  == Operation abgeschlossen. 
120.
echo. 
121.
pause 
122.
 
123.
:: --- 
124.
 
125.
:eof

Beide Batch-Dateien liefern das selbe Ergebnis.

@bastla: Danke für die Korrektur

Grüsse,
wobleibtdiezeit
Bitte warten ..
Mitglied: Biber
19.04.2007 um 19:29 Uhr
Moin, wobleibtdiezeit,

schön, dass Du auch mitmischt...

@all
Wenn ich so den Lösungsfortschritt richtig einschätze, könnten wir wohl spätestens nächste Woche mal das Beste der vorangegangenen 114cm zu einem Tutorial zusammendampfen?

Oder sind etwa Perfektionisten an Bo(a)rd, die noch Verbesserungswünsche haben?

Gruss
Biber
Bitte warten ..
Mitglied: bastla
19.04.2007, aktualisiert 18.10.2012
@Biber

Hast Du übrigens eine Idee zu robcomboy's Arguments-Notstand?

Grüße
bastla
Bitte warten ..
Mitglied: Biber
19.04.2007 um 19:54 Uhr
@bastla
Nein, ist auch bei mir nicht reprozierbar... *ratlos guck*

@robcomboy
Du hast auch nicht zufällig die Ursache inzwischen gefunden?

Gruss
Biber
Bitte warten ..
Mitglied: robcomboy
19.04.2007 um 20:03 Uhr
@bastla
Nein, ist auch bei mir nicht reprozierbar...
*ratlos guck*

@robcomboy
Du hast auch nicht zufällig die Ursache
inzwischen gefunden?

Gruss
Biber

Ich habs grad nochmal probiert.
Vielleicht liegt es auch irgendwie an meinem sys.
ich werds ma anders testen.
bis später
Bitte warten ..
Mitglied: robcomboy
19.04.2007 um 20:12 Uhr
@bastla
Nein, ist auch bei mir nicht reprozierbar...
*ratlos guck*

@robcomboy
Du hast auch nicht zufällig die Ursache
inzwischen gefunden?

Gruss
Biber

Es liegt wohl irendwie an meinem sys.
ich hab wbdz mal das ding geschickt, bei ihm hats gefunzzt.
bei mir nicht, liegt also an meinm sys, wobei ich nicht weiss, wo ich suchen soll, aber nebensache.
Bitte warten ..
Mitglied: bastla
19.04.2007 um 20:56 Uhr
Hallo robcomboy!

Das ist schade, denn ich muss ja mit den Batchern mithalten und habe das Script noch ein wenig aufgebohrt:
01.
'MacheOrdner.vbs 
02.
'Argumente: [BasisPfad] [[.]DateiTyp] [Suchstring[:Suchstring]] 
03.
Const DD = ":" 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
If WScript.Arguments.Count >=1 Then 
06.
    If fso.FolderExists(WScript.Arguments(0)) Then BasisPfad = WScript.Arguments(0) 
07.
End If 
08.
If BasisPfad = "" Then 
09.
    Set Verzeichnis = CreateObject("Shell.Application") _ 
10.
        .BrowseForFolder(0, "Datei oder Verzeichnis wählen", 16, 17) 
11.
    If TypeName(Verzeichnis) = "Nothing" Then WScript.Quit(1) 
12.
    Set Basis = Verzeichnis.Self 
13.
    BasisPfad = Basis.Path 
14.
End If 
15.
If WScript.Arguments.Count >=2 Then 
16.
    DateiTyp = WScript.Arguments(1) 
17.
Else 
18.
    DateiTyp = InputBox("Gesuchten Dateityp eingeben!", "Typ?", "m3u") 
19.
    If DateiTyp = "" Then WScript.Quit(1) 
20.
End If 
21.
If WScript.Arguments.Count >=3 Then 
22.
    Delims = WScript.Arguments(2) 
23.
Else 
24.
    Delims = InputBox("Alle gewünschten Trennzeichen mit '" & DD & "' unterteilt eingeben!", "Trennzeichen?") 
25.
    If Delims = "" Then WScript.Quit(1) 
26.
End If 
27.
Trenn=Split(Delims, DD) 
28.
DateiTyp = LCase(DateiTyp) 
29.
If Left(DateiTyp, 1) <> "." Then DateiTyp = "." & DateiTyp 
30.
For Each Datei In fso.GetFolder(BasisPfad).Files 
31.
    Typ = LCase(Mid(Datei.Name, InstrRev(Datei.Name, "."))) 
32.
    If Typ = DateiTyp Then 
33.
		DName = Left(Datei.Name, Len(Datei.Name) - Len(Typ)) 
34.
		For i = 0 To UBound(Trenn) 
35.
			DName = Replace(DName, Trenn(i), DD) 
36.
		Next 
37.
		DName = Replace(DName, DD & DD, DD) 
38.
        Ordner = Split(DName, DD) 
39.
        Pfad = BasisPfad 
40.
        For i = 0 To UBound(Ordner) 
41.
            Pfad = Pfad & "\" & Trim(Ordner(i)) 
42.
            If Not fso.FolderExists(Pfad) Then fso.CreateFolder(Pfad) 
43.
        Next 
44.
        Datei.Move Pfad & "\" 
45.
    End If 
46.
Next 
47.
WScript.Echo "Fertig."
Jetzt würde das Script folgenden Aufruf erlauben:
01.
MacheOrdner.vbs "D:\Musik und so" .m3u " - :#:_"
Getrennt würde dann bei " - ", bei "#" und bei "_".

Die selbe Eingabe (ohne die Anführungszeichen) kann aber auch über eine weitere InputBox erfolgen, so dass Du (etwas mühsamer) trotzdem testen kannst (wenn Du magst).

Das Trennen der Trennzeichen mit ":" hat übrigens den Hintergrund, dass ein Dateiname ja ohnehin keinen ":" enthalten sollte (ja, ich habe schon gerüchteweise von NTFS ADS gehört) - es kann aber in der Zeile
01.
Const DD = ":"
auch ein anderes Zeichen festgelegt werden.

Grüße
bastla
Bitte warten ..
Mitglied: robcomboy
19.04.2007 um 21:27 Uhr
Hallo robcomboy!

Das ist schade, denn ich muss ja mit den
Batchern mithalten und habe das Script
noch ein wenig aufgebohrt:
01.
'MacheOrdner.vbs 
02.
> 'Argumente: [BasisPfad] [[.]DateiTyp] 
03.
> [Suchstring[:Suchstring]] 
04.
> Const DD = ":" 
05.
> Set fso = 
06.
> CreateObject("Scripting.FileSystemObject") 
07.
> If WScript.Arguments.Count >=1 Then 
08.
>     If 
09.
> fso.FolderExists(WScript.Arguments(0)) Then 
10.
> BasisPfad = WScript.Arguments(0) 
11.
> End If 
12.
> If BasisPfad = "" Then 
13.
>     Set Verzeichnis = 
14.
> CreateObject("Shell.Application") 
15.
> _ 
16.
>         .BrowseForFolder(0, "Datei oder 
17.
> Verzeichnis wählen", 16, 17) 
18.
>     If TypeName(Verzeichnis) = 
19.
> "Nothing" Then WScript.Quit(1) 
20.
>     Set Basis = Verzeichnis.Self 
21.
>     BasisPfad = Basis.Path 
22.
> End If 
23.
> If WScript.Arguments.Count >=2 Then 
24.
>     DateiTyp = WScript.Arguments(1) 
25.
> Else 
26.
>     DateiTyp = InputBox("Gesuchten 
27.
> Dateityp eingeben!", "Typ?", 
28.
> "m3u") 
29.
>     If DateiTyp = "" Then 
30.
> WScript.Quit(1) 
31.
> End If 
32.
> If WScript.Arguments.Count >=3 Then 
33.
>     Delims = WScript.Arguments(2) 
34.
> Else 
35.
>     Delims = InputBox("Alle 
36.
> gewünschten Trennzeichen mit 
37.
> '" & DD & "' 
38.
> unterteilt eingeben!", 
39.
> "Trennzeichen?") 
40.
>     If Delims = "" Then 
41.
> WScript.Quit(1) 
42.
> End If 
43.
> Trenn=Split(Delims, DD) 
44.
> DateiTyp = LCase(DateiTyp) 
45.
> If Left(DateiTyp, 1) <> "." 
46.
> Then DateiTyp = "." & DateiTyp 
47.
> For Each Datei In 
48.
> fso.GetFolder(BasisPfad).Files 
49.
>     Typ = LCase(Mid(Datei.Name, 
50.
> InstrRev(Datei.Name, "."))) 
51.
>     If Typ = DateiTyp Then 
52.
> 		DName = Left(Datei.Name, Len(Datei.Name) - 
53.
> Len(Typ)) 
54.
> 		For i = 0 To UBound(Trenn) 
55.
> 			DName = Replace(DName, Trenn(i), DD) 
56.
> 		Next 
57.
> 		DName = Replace(DName, DD & DD, DD) 
58.
>         Ordner = Split(DName, DD) 
59.
>         Pfad = BasisPfad 
60.
>         For i = 0 To UBound(Ordner) 
61.
>             Pfad = Pfad & "\" 
62.
> & Trim(Ordner(i)) 
63.
>             If Not fso.FolderExists(Pfad) 
64.
> Then fso.CreateFolder(Pfad) 
65.
>         Next 
66.
>         Datei.Move Pfad & "\" 
67.
>     End If 
68.
> Next 
69.
> WScript.Echo "Fertig." 
70.
> 
Jetzt würde das Script
folgenden Aufruf erlauben:
01.
MacheOrdner.vbs "D:\Musik 
02.
> und so" .m3u " - :#:_" 
03.
> 
Getrennt würde dann bei
" - ", bei "#" und bei
"_".

Die selbe Eingabe (ohne die
Anführungszeichen) kann aber auch
über eine weitere InputBox erfolgen, so
dass Du (etwas mühsamer) trotzdem testen
kannst (wenn Du magst).

Das Trennen der Trennzeichen mit
":" hat übrigens den
Hintergrund, dass ein Dateiname ja ohnehin
keinen ":" enthalten sollte (ja,
ich habe schon gerüchteweise von NTFS
ADS gehört
) - es kann aber in der
Zeile
01.
Const DD = ":" 
02.
> 
auch ein anderes Zeichen
festgelegt werden.

Grüße
bastla

Hi Bastla, das mit dem draufziehen wird dann also nichts, leider.
Naja, wenn ich das sys neu installiere, wird sich das erledigt haben.
Das Script funkioniert so, wunderbar.
Das ist natürlich fett, das ich jetzt die Extensions definieren kann.
Geht es auch mehrere extensions zu definieren, so wie man auch die "Separator" mehrfach eintragen kann?

Lässt sich auch ein Fenster einblenden, bei dem man die zutreffenden "Optionen",
" - ","#","_" ankreuzt, sodass nur die berücksichtigt werden die angekreuzt werden.
Bei den Vielen Dateiendungen die es gibt, würde das natürlich den Rahmen sprengen, aber vielleicht kann man häufig verwendete hinzufügen.

Biber hatte ben noch von Perfektionisten gesprochen,
mir ist noch eine Idee eingefallen, wie man das Script noch erweitern könnte.
Diese Funktion bezieht sich auf das wegsortieren von Downloads mit dem VBS-Srcipt.
Es ist noch eine erweiterte Funktion:

Die Möglichkeit, Dateiendungen zu definieren die berücksichtigt werden sollen.
und bei denen soll dann nach dem wegsortieren dann noch die Dateversion angehängt werden, so muss man das nicht manuell machen, indem man z.b. die Install exe aufruft um zu sehen welche Version es ist..

Ich hätte da noch einige weitere Ideen, aber nur, wenn das nicht zu viel ist.

Danke Dir mal wieder für deine Mühe, Bastla !
Bitte warten ..
Mitglied: robcomboy
19.04.2007 um 21:58 Uhr
@bastla
Nein, ist auch bei mir nicht reprozierbar...
*ratlos guck*

@robcomboy
Du hast auch nicht zufällig die Ursache
inzwischen gefunden?

Gruss
Biber

Ich habe mir da schon mal gedanken gemacht, wie man die Batch und das VBS ins
Kontextmenü rein kriegt. Es gibt ein Programm namens, "FileMenuTools."
mit diesem ist es möglich batches etc. ins contextmenu einzubinden, leider funktionierte die batch nicht.
Auch über das "Senden An" Menü hab ich es versucht, weder mit der Batch noch mit dem VBS hat es funktioniert.
Wie man das ganze sonst noch ins Kontextmenü reinfummeln könnte weis ich nicht.

Gruß, robcomboy
Bitte warten ..
Mitglied: miniversum
20.04.2007 um 08:46 Uhr
Ok die Batch mit draufziehbarem Verzeichnis:
01.
@echo off 
02.
 
03.
pushd %1 
04.
for /F "delims=" %%a in ('dir /b /A-D *.m3u') do call:dodir "%%a" 
05.
popd 
06.
goto :ende 
07.
 
08.
:dodir 
09.
set "file=%~n1" 
10.
set "fulldir=%file: - =\%" 
11.
md "%fulldir%" 
12.
move %1 "%fulldir%" 
13.
goto :ende 
14.
 
15.
:ende
miniversum
Bitte warten ..
Mitglied: 45753
20.04.2007, aktualisiert 18.10.2012
Tach,

mit diesen zwei Zeilen am Anfang der Batch ist die Batch Sendto fähig.

cd %~dp1
%~d1

@robocom: jede Batch einzeln in FileMenu Tools einzubinden wäre ein riesiger zeitaufwand der nicht nötig ist. Mach dir einen Hardlink für den Sendto Ordner - wie hier beschrieben...

http://www.administrator.de/wissen/senden-an-im-kontextmen%c3%bc-ver%c3 ...

... von deinem Ordner in dem du alle Batch-Dateien aufbewahrst. Jede Batch-Datei die diese zwei zeilen vorher stehen hat wird dann auch über das Sentto-Menü lauffähig sein.

Kleiner Nebeneffekt: du kannst jetzt neben den Ordnern auch Dateien direkt auf die Batch-Datei ziehen.

01.
@echo off 
02.
 
03.
cd %~dp1 
04.
%~d1 
05.
 
06.
pushd %1 
07.
for /F "delims=" %%a in ('dir /b /A-D *.m3u') do call:dodir "%%a" 
08.
popd 
09.
goto :ende 
10.
 
11.
:dodir 
12.
set "file=%~n1" 
13.
set "fulldir=%file: - =\%" 
14.
md "%fulldir%" 
15.
move %1 "%fulldir%" 
16.
goto :ende 
17.
 
18.
:ende
Grüsse,
wobleibtdiezeit
Bitte warten ..
Mitglied: bastla
20.04.2007 um 11:48 Uhr
Hallo wobleibtdiezeit!

Etwas eleganter: "cd /d %~dp1" oder "pushd %~dp1".

Grüße
bastla
Bitte warten ..
Mitglied: 45753
20.04.2007 um 17:59 Uhr
Nabend,

-Verbesserungen aus den letzten Posts + weiteren Sachen sind in die Batch eingeflossen...
-Man kann nun wie in der Eingabeaufforderung Zeichen eingrenzen. Dritte, die damit vielleicht nix anzufangen weissen, stehen jetzt ein paar Beispiele in der Batch zur Seite.

01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
cls 
04.
 
05.
cd /d %~dp1 
06.
 
07.
:abfrageanfang 
08.
 
09.
echo \\\                               -I-N-F-O-S-                               /// 
10.
echo -==/==========================================================================- 
11.
ECHO  .. Angaben zu Zeichen in Datei(en) 
12.
echo -==/==========================================================================- 
13.
echo -==/==========================================================================- 
14.
ECHO  .. -Beispiel fuer eine Dateieindung: *.m3u 
15.
ECHO  .. -Beispiel fuer mehrere Dateieindungen: *.m3u *.mp3 *.txt 
16.
ECHO  .. -Beispiel fuer ein Zeichen aus Dateinamen: *nelly* 
17.
ECHO  .. -Beispiel fuer mehrere Zeichen aus Dateinamen: *nelly* *timbaland* 
18.
ECHO  .. -Beispiel fuer Kombination aus Beispielen: *nelly*.mp3 *timbaland*.m3u 
19.
echo -==/==========================================================================- 
20.
echo. 
21.
set /p zeichenausdatei= == Zeichen in Datei(en) angeben:  
22.
 
23.
cls 
24.
echo \\\                               -I-N-F-O-S-                               /// 
25.
echo -==/==========================================================================- 
26.
ECHO  .. Angaben zu Trennungszeichen in Dateinamen 
27.
echo -==/==========================================================================- 
28.
echo -==/==========================================================================- 
29.
ECHO  .. -Trennungszeichen von der laengsten zur kuerzesten Zeichenkette angeben. 
30.
ECHO      -Beispiel fuer Trennzeichen: 
31.
echo       "Nelly.Furtado.-.Loose_Promiscuous.mp3" 
32.
echo       "Nelly.Furtado.-.Loose_Say.It.Right.mp3" 
33.
echo       == Trennungszeichen [1/9]: .-. 
34.
echo       == Trennungszeichen [2/9]: _ 
35.
ECHO  .. -Mit ENTER wird Abfrage abgebrochen und bisherige Eingaben ausgefuehrt. 
36.
echo -==/==========================================================================- 
37.
echo. 
38.
set /p fulldir1_choice= == Trennungszeichen [1/9]:  
39.
if "%fulldir1_choice%" == "" goto abfrageende 
40.
set /p fulldir2_choice= == Trennungszeichen [2/9]:  
41.
if "%fulldir2_choice%" == "" goto abfrageende 
42.
set /p fulldir3_choice= == Trennungszeichen [3/9]:  
43.
if "%fulldir3_choice%" == "" goto abfrageende 
44.
set /p fulldir4_choice= == Trennungszeichen [4/9]:  
45.
if "%fulldir4_choice%" == "" goto abfrageende 
46.
set /p fulldir5_choice= == Trennungszeichen [5/9]:  
47.
if "%fulldir5_choice%" == "" goto abfrageende 
48.
set /p fulldir6_choice= == Trennungszeichen [6/9]:  
49.
if "%fulldir6_choice%" == "" goto abfrageende 
50.
set /p fulldir7_choice= == Trennungszeichen [7/9]:  
51.
if "%fulldir7_choice%" == "" goto abfrageende 
52.
set /p fulldir8_choice= == Trennungszeichen [8/9]:  
53.
if "%fulldir8_choice%" == "" goto abfrageende 
54.
set /p fulldir9_choice= == Trennungszeichen [9/9]:  
55.
if "%fulldir9_choice%" == "" goto abfrageende 
56.
 
57.
:abgeschlossen 
58.
 
59.
cls 
60.
echo. 
61.
echo -==/==========================================================================- 
62.
ECHO  .. Ausfuehrung der Operation 
63.
echo -==/==========================================================================- 
64.
echo. 
65.
echo  == Operation abgeschlossen. 
66.
echo. 
67.
pause 
68.
 
69.
goto :eof 
70.
 
71.
:abfrageende 
72.
 
73.
cls 
74.
echo. 
75.
echo -==/==========================================================================- 
76.
ECHO  .. Ausfuehrung der Operation 
77.
echo -==/==========================================================================- 
78.
echo. 
79.
echo  == wait... 
80.
echo. 
81.
 
82.
if "%fulldir1_choice%" == "" set fulldir1_choice="" 
83.
if "%fulldir2_choice%" == "" set fulldir2_choice="" 
84.
if "%fulldir3_choice%" == "" set fulldir3_choice="" 
85.
if "%fulldir4_choice%" == "" set fulldir4_choice="" 
86.
if "%fulldir5_choice%" == "" set fulldir5_choice="" 
87.
if "%fulldir6_choice%" == "" set fulldir6_choice="" 
88.
if "%fulldir7_choice%" == "" set fulldir7_choice="" 
89.
if "%fulldir8_choice%" == "" set fulldir8_choice="" 
90.
if "%fulldir9_choice%" == "" set fulldir9_choice="" 
91.
 
92.
pushd %1 
93.
for /F "delims=" %%a in ('dir /b /A-D %zeichenausdatei%') do call:dodir "%%a" 
94.
popd 
95.
goto :abgeschlossen 
96.
 
97.
:dodir 
98.
 
99.
set "fulldir0=%~n1" 
100.
set "fulldir1=!fulldir0:%fulldir1_choice%=\!" 
101.
 
102.
set "fulldir2=%fulldir1%" 
103.
set "fulldir2=!fulldir1:%fulldir2_choice%=\!" 
104.
 
105.
set "fulldir3=%fulldir2%" 
106.
set "fulldir3=!fulldir2:%fulldir3_choice%=\!" 
107.
 
108.
set "fulldir4=%fulldir3%" 
109.
set "fulldir4=!fulldir3:%fulldir4_choice%=\!" 
110.
 
111.
set "fulldir5=%fulldir4%" 
112.
set "fulldir5=!fulldir4:%fulldir5_choice%=\!" 
113.
 
114.
set "fulldir6=%fulldir5%" 
115.
set "fulldir6=!fulldir5:%fulldir6_choice%=\!" 
116.
 
117.
set "fulldir7=%fulldir6%" 
118.
set "fulldir7=!fulldir6:%fulldir7_choice%=\!" 
119.
 
120.
set "fulldir8=%fulldir7%%" 
121.
set "fulldir8=!fulldir7:%fulldir8_choice%=\!" 
122.
 
123.
set "fulldir9=%fulldir8%" 
124.
set "fulldir9=!fulldir8:%fulldir9_choice%=\!" 
125.
 
126.
md "%fulldir9%" 
127.
move %1 "%fulldir9%" 
128.
 
129.
:eof
Grüsse,
wobleibtdiezeit
Bitte warten ..
Mitglied: miniversum
20.04.2007 um 18:31 Uhr
ACHTUNG GEFÄHRLICH!!!
Was ist der Unterschied von pushd %~dp1 zu pushd %1??
In diesem Fall gehe ich persönlich davon aus dasein Verzeichnis drauf gezogen wird. Dadurch brauche ich diesen ~dp Teil doch garnicht. Im Gegenteil ich bekomme sogar einen Fehler dadurch weil ein Verzeichnis namens "C:\verzeischnis\verzeichnis2" das ich daraufziehe bei einem %1 als "C:\verzeischnis\verzeichnis2" übernommen wird. Bei einem %~dp1 wird hingegen nur das "C:\verzeischnis" übernommen, der Teil "verzeichnis2" würde als Dateiname übernommen.
Hier zum Testen:
01.
@echo off 
02.
echo mit %%1: [%1] 
03.
echo mit %%^~dp1: [%~dp1] 
04.
echo mit %%^~n1: [%~n1] 
05.
echo mit %%^~x1: [%~x1] 
06.
pause
miniversum
Bitte warten ..
Mitglied: bastla
20.04.2007 um 20:00 Uhr
Hallo robcomboy!

Diese Version unterstützt mehrere Extensions:
01.
'MacheOrdner2.vbs 
02.
'Argumente: [BasisPfad] [[.]DateiTyp[ [.]DateiTyp]] [Suchstring[:Suchstring]] 
03.
Const DD = ":" 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
If WScript.Arguments.Count >=1 Then 
06.
    If fso.FolderExists(WScript.Arguments(0)) Then BasisPfad = WScript.Arguments(0) 
07.
End If 
08.
If BasisPfad = "" Then 
09.
    Set Verzeichnis = CreateObject("Shell.Application") _ 
10.
        .BrowseForFolder(0, "Datei oder Verzeichnis wählen", 16, 17) 
11.
    If TypeName(Verzeichnis) = "Nothing" Then WScript.Quit(1) 
12.
    Set Basis = Verzeichnis.Self 
13.
    BasisPfad = Basis.Path 
14.
End If 
15.
If WScript.Arguments.Count >=2 Then 
16.
    DateiTyp = WScript.Arguments(1) 
17.
Else 
18.
    DateiTyp = InputBox("Gesuchten Dateityp eingeben," & vbCrLF & "mehrere Typen durch Leerstellen trennen!", "Typ?", "m3u") 
19.
    If DateiTyp = "" Then WScript.Quit(1) 
20.
End If 
21.
If WScript.Arguments.Count >=3 Then 
22.
    Delims = WScript.Arguments(2) 
23.
Else 
24.
    Delims = InputBox("Alle gewünschten Trennzeichen mit '" & DD & "' unterteilt eingeben!", "Trennzeichen?", " - :#:_") 
25.
    If Delims = "" Then WScript.Quit(1) 
26.
End If 
27.
 
28.
Trenn = Split(Delims, DD) 
29.
DateiTyp = LCase(DateiTyp) 
30.
 
31.
For Each Datei In fso.GetFolder(BasisPfad).Files 
32.
    Typ = LCase(Mid(Datei.Name, InstrRev(Datei.Name, ".") + 1)) 
33.
    If Instr(DateiTyp, Typ) Then 
34.
		DName = Left(Datei.Name, Len(Datei.Name) - Len(Typ)) 
35.
		For i = 0 To UBound(Trenn) 
36.
			DName = Replace(DName, Trenn(i), DD) 
37.
		Next 
38.
		DName = Replace(DName, DD & DD, DD) 
39.
        Ordner = Split(DName, DD) 
40.
        Pfad = BasisPfad 
41.
        For i = 0 To UBound(Ordner) 
42.
            Pfad = Pfad & "\" & Trim(Ordner(i)) 
43.
            If Not fso.FolderExists(Pfad) Then fso.CreateFolder(Pfad) 
44.
        Next 
45.
        Datei.Move Pfad & "\" 
46.
    End If 
47.
Next 
48.
WScript.Echo "Fertig."
Eine "echte" GUI (also etwa mit Check- oder Comboboxen) lässt sich für VBS eigentlich nur über den Umweg "Internet Explorer" simulieren, wovon ich eher Abstand nehmen möchte - als (vielleicht schwacher) Kompromiss bliebe die Variante, in der InputBox mehrere Vorgaben zu machen, wobei die nicht benötigten dann zu löschen wären (im Script oben gezeigt für die Trennzeichen).
Was das Wegsortieren nach Dateitypen mit Anhängen des Datums anlangt, würde ich eher ein weiteres Spezialscript dafür verwenden - es muss ja nicht unbedingt eine an Featuritis erkrankte eierlegende WMS aus diesem kleinen Projekt hier werden ...

Grüße
bastla
Bitte warten ..
Mitglied: 45753
20.04.2007 um 20:43 Uhr
Hallo miniversum,

könntest du mir kurz erklären warum du bei der ausgabe "%%^~x1" geschrieben hast und nicht "%%~x1". Bei mir wird es so nämlich auch korrekt angezeigt. Was hat das Zeichen eigendlich für eine Bedeutung ?

Grüsse,
wbdz
Bitte warten ..
Mitglied: bastla
20.04.2007 um 22:51 Uhr
@miniversum

Und falls es vielleicht doch kein Verzeichnis sein sollte:
01.
if exist "%~1\" ( 
02.
    pushd %1 
03.
    ) else ( 
04.
    pushd "%~dp1" 
05.
)
Grüße
bastla
Bitte warten ..
Mitglied: 45753
21.04.2007 um 11:16 Uhr
Hallo,

ich habe ein paar Comments bekommen, in denen stand aus welchen Gründen meine Batch nutzlos ist.... Nun gut ich habe es eingesehen und mich entschieden die Batch zu löschen.

Sorry, wenn ich hier Blödsinn verbreitet habe...

Grüsse,
wbdz
Bitte warten ..
Mitglied: miniversum
21.04.2007 um 16:38 Uhr
Ist nur Anzeigebedingt.

Hab nicht ausprobiert obs auch ohne geht.

miniversum
Bitte warten ..
Mitglied: miniversum
21.04.2007 um 16:43 Uhr
Ok klar so gehts.
Aber eben kein generelles %~dp1. Das wollte ich damit sagen.
Ohne diese If Abfrage würde es sonst Fehler geben.

miniversum
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...