hi-robbie
Goto Top

FINDSTR Ergebnisse editieren und Pfade auf vorhanden sein überprüfen?

Hallo,
ich suche und probiere schon länger (ca.4h) herum und finde nichts das mir weiterhilft. Ich möchte eine Batch erstellen, mit der ich meine Playlisten etwas komfortabler aufräumen und filtern kann.

Ich kann mit FINDSTR zwar wunderbar Zeilen aus einer Datei in eine neue schreiben.

FINDSTR /I /C:%find1% %source% >>%file1%

Gesucht wird hierbei ein nach einen Pfad -> set find1="\PfadX"
Und die kompletten Zeilen mit dem gesuchten Pfad werden schön in die Neue Zieldatei geschrieben.

Aber wie kann ich jetzt an den Anfang jeder einzelnen übertragenen Zeile noch etwas anhängen? Ich bräuchte jetzt eigentlich noch eine Laufwerksangabe davor zB „D:“
Damit in jeder der übertragenen Zeile dann am Anfang D:\PfadX steht und nicht nur \PfadX.

Weil ich dann außerdem versuchen möchte (wofür ich auch überhaupt keinen richtigen Lösungsvorschlag habe)
Die Zieldatei noch Mal aufteilen in Zeilen in der der Pfad stimmt und den Rest in eine weitere Datei in dem die Pfade die nicht mehr stimmen geschrieben werden.
Oder die Information mit den veralteten Pfaden zusammengefasst gleich am Anfang der Zieldatei stehen.

Das müsste dann (habe ich mir vorgestellt) irgendwie mit IF NOT EXIST D:\PfadX\File.X zu machen sein.
Aber wie komme ich zuerst an die Variablenketten die FINDSTR bei der suche herausfiltert und überträgt direkt heran?

Gruß,
Robbie

Content-Key: 171807

Url: https://administrator.de/contentid/171807

Printed on: April 24, 2024 at 03:04 o'clock

Member: Skyemugen
Skyemugen Aug 20, 2011 at 14:59:59 (UTC)
Goto Top
Aloha,

indem man eine for-Schleife nutzt, da ich momentan keinen klaren Kopf habe, um mir deinen etwas verwirrenden Text erneut detailgetreu durchzulesen, verweise ich dich derweil einfach mal auf unser schönes Tutorial zur FOR-Schleife

greetz André
Member: bastla
bastla Aug 20, 2011 at 15:23:40 (UTC)
Goto Top
Hallo Hi-Robbie!

Ich schließe mich Skye an - so richtig klar ist nicht, was Du bezweckst (ein Vorher-Nachher-Beispiel wirkt oft Wunder face-wink), und Du wirst eine "for /f"-Schleife benötigen - als Starthilfe (ungetestet):
@echo off & setlocal
set "find1=......"  
set "source=......"  
set "file1=......"  

del "%file1%" 2>nul  
for /f "delims=" %%i in ('findstr /i /c:"%find1%" "%source%"') do set "Zeile=%%i" & call :ProcessLine "%%i"  
goto :eof

:ProcessLine
setlocal enabledelayedexpansion
::if exist .....
echo D:!Zeile!
endlocal
goto :eof
Zum Testen wird hier zunächst auf dem Bildschirm ausgegeben - um in die Zieldatei zu schreiben:
>>"%file1%" echo D:!Zeile!
Die Zeilen mit ..... konnte ich wegen mangelnder Informationen nur andeuten.

Grüße
bastla
Member: Hi-Robbie
Hi-Robbie Aug 20, 2011 at 19:53:52 (UTC)
Goto Top
Danke für die Hilfe, ich hab es jetzt.
Ich war auch schon ziemlich nahe dran und hab logisch schon an einer Schleife herum probiert.
Aber die sind mir leider immer noch ein großes Rätsel?!? Und ich bin wohl an den Gänsefüßchen gescheitert.
Und von setlocal enabledelayedexpansion habe ich auch noch nie etwas gesehen oder gehört?

Zum nachvollziehen was ich jetzt genau gemacht habe zeige ich Mal ein Vorher/Nachher Beispiel:

Datei Vorher:
#EXTM3U
#EXTINF:246,Xavier Naidoo - Dieser Weg
\AUDIO.MP3\Xavier Naidoo - Dieser Weg (test).mp3
#EXTINF:249,Xavier Naidoo - Bist du aufgewacht
\AUDIO.MP3\Xavier Naidoo - Bist du aufgewacht.mp3
#EXTINF:224,Xavier Naidoo - Was Wir Alleine Nicht Schaffen
\AUDIO.MP3\Xavier Naidoo - Was Wir Alleine Nicht Schaffen.mp3
#EXTINF:244,Xavier Naidoo & Söhne Mannheim - Und Wenn Ein Lied
\AUDIO.MP3\Xavier Naidoo & Söhne Mannheim - Und Wenn Ein Lied.mp3
#EXTINF:253,Xavier Naidoo & Söhne Mannheim - Wenn Du Schläfst
\AUDIO.MP3\Xavier Naidoo & Söhne Mannheim - Wenn Du Schläfst.mp3

Datei Nacher:
#EXTM3U
\AUDIO.MP3\Xavier Naidoo - Dieser Weg (test).mp3
\AUDIO.MP3\Xavier Naidoo & Söhne Mannheim - Und Wenn Ein Lied.mp3
\AUDIO.MP3\Xavier Naidoo & Söhne Mannheim - Wenn Du Schläfst.mp3
X:\AUDIO.MP3\Xavier Naidoo - Bist du aufgewacht.mp3
X:\AUDIO.MP3\Xavier Naidoo - Was Wir Alleine Nicht Schaffen.mp3


Die Batch dazu:
@echo off & setlocal
set sourcefile=%~nx1
set sourcetemp=%~n1
set find="\AUDIO.MP3"  
copy %sourcefile% %sourcetemp%0.bak
if exist %sourcetemp%0.bak del %sourcefile%
>>%sourcetemp%2.bak Echo #EXTM3U
for /f "delims=" %%i in ('findstr /i /c:"%find%" "%sourcetemp%0.bak"') do set "Line=%%i" & call :ProcessLine "%%i"  
goto Ende

:ProcessLine
setlocal enabledelayedexpansion 
Echo !Line!
if exist "X:!Line!" >>%sourcetemp%1.bak Echo X:!Line!  
if not exist "X:!Line!" >>%sourcetemp%2.bak Echo !Line!  
endlocal
goto :eof

:Ende
copy %sourcetemp%2.bak+%sourcetemp%1.bak %sourcefile%
Echo .
Echo fertig!
TIMEOUT /T 3 >NUL
if exist %sourcefile% del %sourcetemp%0.bak %sourcetemp%1.bak %sourcetemp%2.bak
cls; exit

Das einzige was nicht richtig funktioniert, ist wie in dem Beispiel, das die Einträge mit deutschen Umlauten beim Pfad suchen, diesen nicht finden.
Und woher das – am Ende der Datei kommt, kann ich mir auch nicht erklären?
Weil in den Quelldateien ist es noch nicht da, erst nach dem zusammenfügen.
Aber mir passt es auch so, wie es ist. Die Playlisten funktionieren und Einträge die nicht Korrekt sind stehen jetzt ganz am Anfang und kann sie leicht überprüfen, ändern, löschen.

Danke und schöne Grüße,
Robbie
[Edit Biber] Codeformatierung nachgezogen.[/Edit]
Member: bastla
bastla Aug 20, 2011 at 20:16:59 (UTC)
Goto Top
Hallo Hi-Robbie!

Hinsichtlich der Umlaute könntest Du noch ein
chcp 1252>nul
vorweg versuchen und damit die Codepage umschalten (Standard ist 850) ...
das – am Ende der Datei
... sehe ich gar nicht ...
Anmerkungen:
"setlocal enabledelayedexpansion" und das zugehörige "endlocal" ersparen das Maskieren (durch ein vorangestelltes "^") allfälliger Sonderzeichen (vor allem wäre hier das "&" ein Thema) bei der Ausgabe von %Zeile% ...

Mit der Schreibweise
>"%sourcetemp%2.bak" Echo #EXTM3U
könntest Du sicher stellen, dass eine neue Datei erstellt wird.

if exist "X:!Line!" >>%sourcetemp%1.bak Echo X:!Line!  
if not exist "X:!Line!" >>%sourcetemp%2.bak Echo !Line!  
ließe sich auch so schreiben:
if exist "X:!Line!" (>>%sourcetemp%1.bak Echo X:!Line!) else (>>%sourcetemp%2.bak Echo !Line!)

Die Zeile
cls; exit
ist doppelt sinnlos, da einerseits syntaktisch falsch und andererseits - wenn es denn tatsächlich ein "exit" sein muss (der Batch endet ja ohnehin hier) - schließt sich unabhängig davon, ob der Inhalt noch schnell gelöscht wurde, das CMD-Fenster gleich gut ... face-wink

Grüße
bastla

P.S.: Falls Dir (doch sicherlich face-wink) die Darstellung des Codes in meinen Kommentaren gefällt - das kannst Du auch (sogar nachträglich):
Member: Biber
Biber Aug 20, 2011 at 21:08:52 (UTC)
Goto Top
[OT]
Zitat von @bastla:
Die Zeile
cls; exit
ist doppelt sinnlos, da einerseits syntaktisch falsch und andererseits ....
Wiederum andererseits - du plauderst grad mit einer Spezies, die playlistenweise Xavier-Naidoo-Schmelzkäse umschichtet.
Also etwas mehr Toleranz gegenüber ungewöhnlichen Verhaltensweisen bitte. face-wink

P.S.: Falls Dir (doch sicherlich face-wink) die Darstellung des Codes in meinen Kommentaren gefällt - das kannst Du auch (sogar
nachträglich):
Na, ich mach es ihm lieber schnell, weil... s.o.

Grüße
Biber
[/OT]
Mitglied: 60730
60730 Aug 20, 2011 at 22:36:45 (UTC)
Goto Top
moinsen,

[OT]
  • wenn ich mir dieses "vorhör/nachhör" ohne mir das anzuhören bildlich durch den Kopf jage und dann sinngemäß eine Zeile lese - pfad stimmt, stimmt nicht...
  • Würde ich doch auf das ganze m3u auslesen pfeifen und via
echo >#EXTM3U
dir/b >>
werkeln...
Ganz ohne Fliege und die Schleife max. um den Hauptordner jagen, wo sich dieses Jannheimer Gemaule versteckt.
[/OT]

Gruß
Member: Biber
Biber Aug 20, 2011 at 23:00:19 (UTC)
Goto Top
[OT ii] @t-mo
Natürlich ginge es auch so.
Aber du kennst deren Motto "Dieser Weg wird kein leichter sein" und "Was wir alleine nicht schaffen, machen wir immer wieder" oder so ähnlich. face-wink

"Und wenn ein Batch meine Tasten verlässt..." *schmalztrief*

Grüße
Biber
[/OT ii]
Member: Hi-Robbie
Hi-Robbie Aug 21, 2011 at 13:13:28 (UTC)
Goto Top
Danke für alle Hinweise (und Komentareface-wink)

cls; exit
habe ich immer benutzt, weil sich unter Win9x das Fenster zum Schluß nicht automatisch geschlossen hat. Mit dieser Zeile halt dann schon (glaub ich jetzt, das es so war?)

dir/b >>
Hilft mir nicht wirklich, danke aber für Deine mühe.

Hab das Prog jetzt noch ein wenig verändert und füg jetzt dann als Ergebnis auch noch gleich lieber noch eine Andere Playlist mit dran.

@echo off & setlocal
chcp 1252>nul
COLOR 0A

set source=%~nx1
set temp=%~n1
set find=\AUDIO.MP3

copy /V  %source% %temp%0.bak
if exist %temp%0.bak del %source%

>%temp%1.bak Echo #EXTM3U
>%temp%2.bak Echo #???

for /f "delims=" %%i in ('findstr/i/c:%find% %temp%0.bak') do (   
Echo %%i
if not exist X:%%i (>>%temp%2.bak Echo %%i) else (>>%temp%1.bak Echo %%i)
)

Copy /V %temp%1.bak+%temp%2.bak %source%
if exist %source% del %temp%1.bak %temp%2.bak %temp%0.bak

Echo .
Echo fertig!
TIMEOUT /T 1 >NUL
cls; exit

Ergebnis
#EXTM3U
\AUDIO.MP3\12 Stones - Broken.mp3
\AUDIO.MP3\Danzig - Mother (cover).mp3
\AUDIO.MP3\Disturbed - Devour.mp3
\AUDIO.MP3\Disturbed - Down With The Sickness.mp3
\AUDIO.MP3\Disturbed - Rise.mp3
\AUDIO.MP3\Megadeth (& NIN) - Symphony Of Destruction (remix.mp3
\AUDIO.MP3\Rob White Zombie - Devil Man.mp3
\AUDIO.MP3\Slipknot - Wait & Bleed.mp3
\AUDIO.MP3\System Of A Down - Chop Suey! (single).mp3


Ich überlege ob ich die Einträge in %temp%1.bak noch irgendwie Sortieren und Doppelte weg lassen kann. Aber wie das gehen soll. Wahrscheinlich auch mit einer Schleife und jeden Eintrag in eine Variable schreiben lassen oder?

copy /V  %source% %temp%0.bak
if exist %temp%0.bak del %source%
Kann man das auch noch irgendwie anders machen? Vielleicht dem File nur einen anderen Namen geben?

Gruß
Robbie
Member: Hi-Robbie
Hi-Robbie Aug 22, 2011 at 13:34:24 (UTC)
Goto Top
Hallo,
Echo %%i zeigt mir noch den Ausdruck an, den ich haben möchte,
aber wie schreibt man diese Information in eine neue Variable?
So bekomme ich es leider nicht hin, was muss ich da anders machen?
Kann das mir bitte jemand zeigen.

for /f "delims=" %%i in ('findstr/i/c:%find% %source%') do (   
Echo %%i
set "file=%%i"  
Echo %file%
)

Gruß
Robbie
Member: bastla
bastla Aug 22, 2011 at 13:39:55 (UTC)
Goto Top
Hallo Hi-Robbie!

Wozu brauchst Du eine neue Variable?
Ansonsten kannst Du nach dem gleichen Schema wie in der Zeile 7 ganz oben (also Aufruf eines Unterprogramms) vorgehen (denn die Alternative "delayEdexpansion" wäre hier etwas unhandlich, sobald eine Zeile zumindest ein "!" enthält) ...

... als Beispiel für eine sortierte Ausgabe der Datei "temp1.bak" ohne Duplikate (= Zeilen, die mit Ausnahme der Groß-/Kleinschreibung - wegen "if /i" - exakt übereinstimmen):
@echo off & setlocal
set "Ein=temp1.bak"  
set "Aus=temp2.bak"  

set "Zuletzt="  
for /f "delims=" %%i in ('sort %Ein%') do set "Zeile=%%i" & call :ProcessLine  
goto :eof

:ProcessLine
if /i "%Zeile%"=="%Zuletzt%" goto :eof  
setlocal enabledelayedexpansion
>>"%Aus%" echo !Zeile!  
endlocal
set "Zuletzt=%Zeile%"  
goto :eof
Grüße
bastla
Member: Hi-Robbie
Hi-Robbie Aug 22, 2011 at 17:27:46 (UTC)
Goto Top
Danke Bastla, das werde ich sicher noch einbauen.
Aber ich bin jetzt schon an einer anderen Batch. Und zwar möchte ich die Songs aus der Playlist in einen extra Ordner noch kopieren können. Ziel dabei ist es, wenn ich eine CD brennen möchte mit CD Burner XP, dann kann man nicht einfach eine Playlist als Quelle hernehmen.
Ich lege zuerst einen Ordner an
set folder=%~n1
MD %folder%
Und dann hätte ich probiert zu kopieren
if exist X:%%i (copy X:%%i %folder%\%%i%~nx1)
aber das klapt ja so leider überhaupt nicht.
Ich brauche glaube ich also zuerst eine neu Variable und dann würde ich daraus denn Datei Namen nehmen.
for  %%i in ("%%i") do set "DATEI=%%~nxi"  
Und dann den Pfad zusammen basteln
%folder%\%DATEI%
Und dann könnte es vielleicht schon irgendwie gehen?
Im Übrigen auch wenn das alles Quatsch sein sollte. Aber es müsste doch gehen den Wert von %%i in eine neue Variable zu übernehmen?
Ich bin darüber jetzt sehr wissbegierig und möchte ein wenig besser mit Batch zurechtkommen, weil ich es wahnsinnig finde, was man damit noch alles selber programmieren kann (wenn man einen Plan davon hat)

Gruß,
Robbie
Member: bastla
bastla Aug 22, 2011, updated at Oct 18, 2012 at 16:48:00 (UTC)
Goto Top
Hallo Hi-Robbie!

Deswegen ja auch vorweg die Frage, wozu die Variable gut sein sollte - für den angegebenen Zweck jedenfalls schon mal nicht ...

Ausgehend von zB
\AUDIO.MP3\12 Stones - Broken.mp3
als Inhalt von %%i wäre zunächst mal "%%~ni" = "12 Stones - Broken" - Dein "md" scheiterte dann daran, dass sich im Namen Leerzeichen befinden, und daher der Ordner nur "12" hieße (Anführungszeichen schaffen hier Abhilfe).

Analog kann auch die "if exist"-Abfrage ohne Anführungszeichen keinen Erfolg haben.

Wenn Du schließlich als Ziel "%folder%\%%i%~nxi" angibst (wobei die Variable wie erwähnt unnötig und durch ihren vorher zugewiesenen Wert "%%~ni" zu ersetzen ist), würdest Du - angenommen, die benötigten Anführungszeichen wären gesetzt - folgendes Ziel erzeugen:
<aktueller Ordner>\12 Stones - Broken\\AUDIO.MP3\12 Stones - Broken.mp312 Stones - Broken.mp3
Da Du das ja nun sicher nicht vor (aber eigentlich ja einen bis auf das Laufwerk vollständigen Pfad zur Verfügung) hast, könntest Du einfach zu "xcopy" greifen - das kann nämlich den Zielpfad mit anlegen - im einfachsten Fall so:
if exist "X:%%i" xcopy "X:%%i" "Y:\Kopierte Songs%%i*"
oder, wenn tatsächlich der ursprüngliche Pfad nicht verwendet werden soll:
if exist "X:%%i" xcopy "X:%%i" "Y:\Kopierte Songs\%%~ni\%%~nxi*"
Die Zielangabe kann natürlich auch "%%~ni\%%~nxi*" lauten - dann wird der Zielordner unterhalb des aktuellen Ordners angelegt. Übrigens: Anhand des "*" am Ende erkennt "xcopy", dass das Ziel eine Datei und kein Verzeichnis ist und erspart sich (und vor allem Dir face-wink) die entsprechende Nachfrage ...

Eine andere Nachfrage erspare ich Dir allerdings nicht, nämlich: Willst Du nicht eher einen Ordner nur mit dem Interpretennamen anlegen? face-wink
Wenn Du partout innerhalb von Schleifen Variablen nicht nur erstellen, sondern diese auch gleich verwenden willst (was natürlich in anderen Szenarien nicht nur sinnvoll, sondern sogar nötig sein kann), kannst Du den von mir dargestellten Weg über ein Unterprogramm nehmen oder auf "delayedExpansion" zurückgreifen - zu diesem Thema gibt es hier eine Menge zu finden (BTW: Hast Du schon Friemlers - von Skye oben verlinktes - Tutorial durch?).

Warum ich eher zum Unterprogramm rate, kann ich aber kurz demonstrieren:
@echo off & setlocal
::Variable wird bei aktiver "delayedExpansion" erstellt 
setlocal enabledelayedexpansion
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single).mp3"  
echo !Zeile!
endlocal
::"delayedExpansion" wird erst nach Erstellung der Variablen aktiviert 
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single).mp3"  
setlocal enabledelayedexpansion
echo !Zeile!
endlocal

echo\

::Variable wird bei aktiver "delayedExpansion" erstellt 
setlocal enabledelayedexpansion
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single!).mp3"  
echo !Zeile!
endlocal
::"delayedExpansion" wird erst nach Erstellung der Variablen aktiviert 
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single!).mp3"  
setlocal enabledelayedexpansion
echo !Zeile!
endlocal
Im ersten Beispiel (nur ein "!") verschwindet nur das eine "!", im zweiten Fall alles vom ersten bis zum zweiten "!" - das jeweilige Gegenbeispiel mit dem "Vorweg-Erstellen" der Variablen soll nur zeigen, was dieser Teil in meinem Batch oben macht, wäre aber für Dein Vorhaben nicht zielführend - daher würde Dich (als Demo)
@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%i in ('findstr/i/c:%find% %source%') do (  
    set "Ordner=%%~ni"  
    set "Datei=%%~nxi"  
    echo !Ordner!
    echo %%~ni
    echo !Datei!
    echo %%~nxi
    echo\
)
ziemlich sicher nicht glücklich machen ...

Grüße
bastla

P.S.: Sollte die Antwort auf meine zwischendurch gestellte Nachfrage "ja" lauten, könnte Dich dieser Beitrag interessieren ...
Member: Hi-Robbie
Hi-Robbie Aug 23, 2011 at 13:39:16 (UTC)
Goto Top
Ich danke Dir vielmals Bastler für Deine Hilfe und Erläuterungen.

Ich gebe Dir recht, das man nicht eine neue Variable braucht, wenn man es auch so hinbekommt. Ich hätte damit versucht über einen Umweg an das zu kommen, was ich brauche. Und trotzdem verstehe ich nicht dass man aus einem vorhandenen Wert nicht einfach eine neue setzen kann?
Die Lösung für mich war jetzt einmal, das man aus %%i einfach %%~ni machen kann!
Das habe ich nicht gewusst und ich hätte es ja schon so damit probiert %%i%~ni und gehofft das es das gleiche tut.

Deine Demonstration von gestern habe ich jetzt nur leider ein wenig durch geschaut, aber ich zieh es mir bestimmt schon noch genauer rein. Für mich ist alles echt so Zeitaufwendig zu verstehen. Das gleiche und noch undurchschaubarer gilt für die %$@!! Schleifen.

Ich habe jetzt mein Batch so gemacht und er funktioniert fast so wie ich haben möchte!
@echo off & setlocal
chcp 1252>nul
color 0a

set find=\AUDIO.MP3
set "source=%~nx1"  
set "folder=%~n1"  
set "sdrive=%~d0"  
set "stpath=%~p1"  
set /a "nr=1"  

if not exist "%folder%" md "%folder%"  

for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do (   
echo.
echo    %nr%  %%~ni
if exist "%sdrive%%%i" copy "%sdrive%%%i" "%sdrive%%stpath%%folder%\%nr%_%%~nxi"  
if not exist "%sdrive%%%i" >"%sdrive%%stpath%%folder%\_%nr%_%%~ni" echo.  

set /a "nr+=1"  
)

Nur Zählt die Nummer in der Schleife nicht mit? Außerhalb der Schleife würds funktionieren, warum nicht in der Schleife, was kann man denn da machen?
Und die Ausgabe von Copy „1 Datei(en) wurde kopiert“ kann man nicht irgendwie ausschalten??
Hab in der Dokumentation von Copy /? Schon nachgeschaut, aber da steht nichts. Aber vielleicht geht’s ja doch irgendwie?

Gruß,
Robbie
Member: bastla
bastla Aug 23, 2011 at 13:46:37 (UTC)
Goto Top
Hallo Hi-Robbie
Und trotzdem verstehe ich nicht dass man aus einem vorhandenen Wert nicht einfach eine neue setzen kann?
Das habe ich auch nie behauptet, sondern nur infrage gestellt, wie sinnvoll das wäre - insbesondere hinsichtlich der Nebenwirkungen von "delayedExpansion" (das Beipiel dazu kannst Du übrigens 1:1 übernehmen und ablaufen lassen).

Für Deine Variable %nr% gilt das oben Gesagte: Entweder über ein Unterprogramm abwickeln oder mit "delayedExpansion" - was ich empfehlen würde, errätst Du vermutlich nie face-wink ...
Und die Ausgabe von Copy „1 Datei(en) wurde kopiert“ kann man nicht irgendwie ausschalten??
So wie bei jedem Befehl kannst Du die Ausgabe umleiten - in diesem Fall wäre das Ziel mit "nul" (aka "Nirwana" face-wink) anzugeben

Grüße
bastla
Member: Hi-Robbie
Hi-Robbie Aug 23, 2011 at 16:00:00 (UTC)
Goto Top
Ich glaub ich habs erraten was Du empfiehlst , aber es funktioniert bei mir mal wieder nicht!
Jetzt zählt zwar die Nr aufwärts, aber der Inhalt von %%i ist weg?

 @echo off & setlocal
chcp 1252>nul
color 0a

set find=\AUDIO.MP3
set "source=%~nx1"  
set "folder=%~n1"  
set "sdrive=%~d0"  
set "stpath=%~p1"  
set /a "nr=1"  

if not exist "%folder%" md "%folder%"  


for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do call :ProcessLine  

goto :Ende

:ProcessLine
setlocal enabledelayedexpansion

echo %nr%  %%~ni

:: if exist "%sdrive%%%i" copy "%sdrive%%%i" "%sdrive%%stpath%%folder%\%nr%_%%~nxi" >NUL 
:: if not exist "%sdrive%%%i" >"%sdrive%%stpath%%folder%\_%nr%_%%~ni" Echo. 

endlocal 

set /a "nr+=1"  

goto :eof

:Ende

Gruß
Robbie
Member: Hi-Robbie
Hi-Robbie Aug 23, 2011 at 16:15:57 (UTC)
Goto Top
Und so zählt die Nr. wider nicht mit?

 @echo off & setlocal
chcp 1252>nul
color 0a

set find=\AUDIO.MP3
set "source=%~nx1"  
set "folder=%~n1"  
set "sdrive=%~d0"  
set "stpath=%~p1"  
set /a "nr=1"  

if not exist "%folder%" md "%folder%"  


for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do (   
setlocal enabledelayedexpansion
echo.
echo    %nr%  %%~ni

if exist "%sdrive%%%i" copy "%sdrive%%%i" "%sdrive%%stpath%%folder%\%nr%_%%~nxi"  
if not exist "%sdrive%%%i" >"%sdrive%%stpath%%folder%\_%nr%_%%~ni" echo.  
endlocal 

call :ProcessLine
)

:ProcessLine
echo Process
set /a "nr+=1"  
goto :eof

Gruß
Robbie
Member: Skyemugen
Skyemugen Aug 23, 2011 at 16:30:25 (UTC)
Goto Top
Aloha,

du solltest es vielleicht mal sinnvollerweise mit
for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do call :ProcessLine "%%i"
(mit oder ohne Zollzeichen, keine Ahnung, was in %%i vorkommt) und
echo %nr%  "%~n1" & REM im Unterprozess
versuchen face-wink
Denn auf deinem (oberen) Weg rufst du zwar aus der Schleife den Unterprozess auf, übergibst aber die FOR-Variable nicht und da %%i auf normalem, diesem Weg nicht außerhalb der Schleife existiert, ist das Ergebnis leer, also musst du den Unterprozess mit einem übergebenen Parameter übergeben, der dann im Unterverzeichnis mit %1 in der Urform gültig ist.

greetz André
Member: Biber
Biber Aug 23, 2011 at 17:03:24 (UTC)
Goto Top
Moin Hi-Robbie,

ergänzend zu Skye's Hinweisen könntest du eine erste proof-of-concept-Annäherung so vorgehen.

Angenoomen, die gefundenden Suchstring-Titiel sähen so aus wie oben gepostet:

Beispiel Hirobbiemp3.txt
\AUDIO.MP3\12 Stones - Broken.mp3
\AUDIO.MP3\Danzig - Mother (cover).mp3
\AUDIO.MP3\Disturbed - Devour.mp3
\AUDIO.MP3\Disturbed - Down With The Sickness.mp3
\AUDIO.MP3\Disturbed - Rise.mp3
\AUDIO.MP3\Megadeth (& NIN) - Symphony Of Destruction (remix.mp3
\AUDIO.MP3\Rob White Zombie - Devil Man.mp3
\AUDIO.MP3\Slipknot - Wait & Bleed.mp3
\AUDIO.MP3\System Of A Down - Chop Suey! (single).mp3

Dann könntest du mit diesen Ersatz-Zeilen das Gerüst prüfen und verfeinern

......
REM ERSETZT ab "for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do call :ProcessLine"  
for /f "delims=" %%i in (hirobbiemp3.txt) do call :ProcessLine "%%~ni"  


goto :Ende

:ProcessLine
setlocal enabledelayedexpansion
Set "thistitle=%~1"  
Set "thistitle=%thistitle:&=^&%"  
echo %nr%  %thistitle% 
.....
REM ERSETZT bis "echo    %nr%  %%~ni " inklusive  
....

Ausgabe wäre dann in etwa

1  12 Stones - Broken
2  Danzig - Mother (cover)
3  Disturbed - Devour
4  Disturbed - Down With The Sickness
5  Disturbed - Rise
6  Megadeth (& NIN) - Symphony Of Destruction (remix
7  Rob White Zombie - Devil Man
8  Slipknot - Wait & Bleed
9  System Of A Down - Chop Suey (single)

Die neue Zwischenvariable %thistitle% soll nur sicherstellen, dass das Batch-Sonderzeichen "&" nicht zu unerwarteten Effekten führt.

Grüße
Biber

P.S. Wenn ich das "Setlocal ENABLEDelayedExpansion" NICHT übernehme oder ein DISableDelayedExpansion daraus mache, dann ändert sich Ausgabezeile 9 zu
9  System Of A Down - Chop Suey! (single)
Member: bastla
bastla Aug 23, 2011 at 18:19:36 (UTC)
Goto Top
@Biber
Der Plan wäre aber eigentlich
@echo off & setlocal
set /a nr=1
for /f "delims=" %%i in (hirobbiemp3.txt) do call :ProcessLine "%%~ni"  
goto :eof

:ProcessLine
set "thistitle=%~1"  
setlocal enabledelayedexpansion
echo %nr%  !thistitle!
endlocal
set /a nr+=1
goto :eof
Die Verwendung von "setlocal enabledelayedexpansion" / "endlocal" soll ja den Effekt erzielen, dass das Maskieren von Sonderzeichen dadurch entfallen kann (vorher war ja die Zeile durch die Verwendung der Anführungszeichen "unter Kontrolle") ...

Es spräche ja eigentlich auch nix dagegen, die Zuweisung zur Variablen %thistitle% bereits in der "for"-Schleife vorzunehmen und die komplette Zeile als Parameter zu übergeben
for /f "delims=" %%i in (hirobbiemp3.txt) do set "thistitle=%%~ni" & call :ProcessLine "%%i"
- nach dem Motto "best of both worlds" könnte dann im Unterprogramm auch der komplette Pfad (oder der davon benötigte Teil) aus dem Parameter %1 für die Angabe von Quelle / Ziel oder whatever verwendet werden.

Grüße
bastla
Member: Biber
Biber Aug 23, 2011 at 19:28:24 (UTC)
Goto Top
Moin bastla,

du hast natürlich Recht - ich hatte diesen (durchaus charmanten) Teil des Plans überlesen.
Der muss wohl in den 57 Beitragszentimetern skizziert wurden sein, die ich nur überflogen habe.

Habe mir aber gleich gedacht, dass sich Threads mit X. Naidoo-Prosa ziehen werden wie die Restlaufzeitverlängerung der FDP.

Grüße
Biber