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

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

Frage Entwicklung Batch & Shell

Mitglied: Hi-Robbie

Hi-Robbie (Level 1) - Jetzt verbinden

20.08.2011, aktualisiert 18.10.2012, 4307 Aufrufe, 20 Kommentare

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
Mitglied: Skyemugen
20.08.2011 um 16:59 Uhr
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é
Bitte warten ..
Mitglied: bastla
20.08.2011 um 17:23 Uhr
Hallo Hi-Robbie!

Ich schließe mich Skye an - so richtig klar ist nicht, was Du bezweckst (ein Vorher-Nachher-Beispiel wirkt oft Wunder ), und Du wirst eine "for /f"-Schleife benötigen - als Starthilfe (ungetestet):
01.
@echo off & setlocal 
02.
set "find1=......" 
03.
set "source=......" 
04.
set "file1=......" 
05.
 
06.
del "%file1%" 2>nul 
07.
for /f "delims=" %%i in ('findstr /i /c:"%find1%" "%source%"') do set "Zeile=%%i" & call :ProcessLine "%%i" 
08.
goto :eof 
09.
 
10.
:ProcessLine 
11.
setlocal enabledelayedexpansion 
12.
::if exist ..... 
13.
echo D:!Zeile! 
14.
endlocal 
15.
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
Bitte warten ..
Mitglied: Hi-Robbie
20.08.2011 um 21:53 Uhr
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:
01.
@echo off & setlocal 
02.
set sourcefile=%~nx1 
03.
set sourcetemp=%~n1 
04.
set find="\AUDIO.MP3" 
05.
copy %sourcefile% %sourcetemp%0.bak 
06.
if exist %sourcetemp%0.bak del %sourcefile% 
07.
>>%sourcetemp%2.bak Echo #EXTM3U 
08.
for /f "delims=" %%i in ('findstr /i /c:"%find%" "%sourcetemp%0.bak"') do set "Line=%%i" & call :ProcessLine "%%i" 
09.
goto Ende 
10.
 
11.
:ProcessLine 
12.
setlocal enabledelayedexpansion  
13.
Echo !Line! 
14.
if exist "X:!Line!" >>%sourcetemp%1.bak Echo X:!Line! 
15.
if not exist "X:!Line!" >>%sourcetemp%2.bak Echo !Line! 
16.
endlocal 
17.
goto :eof 
18.
 
19.
:Ende 
20.
copy %sourcetemp%2.bak+%sourcetemp%1.bak %sourcefile% 
21.
Echo . 
22.
Echo fertig! 
23.
TIMEOUT /T 3 >NUL 
24.
if exist %sourcefile% del %sourcetemp%0.bak %sourcetemp%1.bak %sourcetemp%2.bak 
25.
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]
Bitte warten ..
Mitglied: bastla
20.08.2011 um 22:16 Uhr
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.

01.
if exist "X:!Line!" >>%sourcetemp%1.bak Echo X:!Line! 
02.
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 ...

Grüße
bastla

P.S.: Falls Dir (doch sicherlich ) die Darstellung des Codes in meinen Kommentaren gefällt - das kannst Du auch (sogar nachträglich): Code-Formatierung
Bitte warten ..
Mitglied: Biber
20.08.2011 um 23:08 Uhr
[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.

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

Grüße
Biber
[/OT]
Bitte warten ..
Mitglied: 60730
21.08.2011 um 00:36 Uhr
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ß
Bitte warten ..
Mitglied: Biber
21.08.2011 um 01:00 Uhr
[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.

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

Grüße
Biber
[/OT ii]
Bitte warten ..
Mitglied: Hi-Robbie
21.08.2011 um 15:13 Uhr
Danke für alle Hinweise (und Komentare)

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.

01.
@echo off & setlocal 
02.
chcp 1252>nul 
03.
COLOR 0A 
04.
 
05.
set source=%~nx1 
06.
set temp=%~n1 
07.
set find=\AUDIO.MP3 
08.
 
09.
copy /V  %source% %temp%0.bak 
10.
if exist %temp%0.bak del %source% 
11.
 
12.
>%temp%1.bak Echo #EXTM3U 
13.
>%temp%2.bak Echo #??? 
14.
 
15.
for /f "delims=" %%i in ('findstr/i/c:%find% %temp%0.bak') do (  
16.
Echo %%i 
17.
if not exist X:%%i (>>%temp%2.bak Echo %%i) else (>>%temp%1.bak Echo %%i) 
18.
19.
 
20.
Copy /V %temp%1.bak+%temp%2.bak %source% 
21.
if exist %source% del %temp%1.bak %temp%2.bak %temp%0.bak 
22.
 
23.
Echo . 
24.
Echo fertig! 
25.
TIMEOUT /T 1 >NUL 
26.
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?

01.
copy /V  %source% %temp%0.bak 
02.
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
Bitte warten ..
Mitglied: Hi-Robbie
22.08.2011 um 15:34 Uhr
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.

01.
for /f "delims=" %%i in ('findstr/i/c:%find% %source%') do (  
02.
Echo %%i 
03.
set "file=%%i" 
04.
Echo %file% 
05.
)
Gruß
Robbie
Bitte warten ..
Mitglied: bastla
22.08.2011 um 15:39 Uhr
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):
01.
@echo off & setlocal 
02.
set "Ein=temp1.bak" 
03.
set "Aus=temp2.bak" 
04.
 
05.
set "Zuletzt=" 
06.
for /f "delims=" %%i in ('sort %Ein%') do set "Zeile=%%i" & call :ProcessLine 
07.
goto :eof 
08.
 
09.
:ProcessLine 
10.
if /i "%Zeile%"=="%Zuletzt%" goto :eof 
11.
setlocal enabledelayedexpansion 
12.
>>"%Aus%" echo !Zeile! 
13.
endlocal 
14.
set "Zuletzt=%Zeile%" 
15.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: Hi-Robbie
22.08.2011 um 19:27 Uhr
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
01.
set folder=%~n1 
02.
MD %folder%
Und dann hätte ich probiert zu kopieren
01.
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.
01.
for  %%i in ("%%i") do set "DATEI=%%~nxi"
Und dann den Pfad zusammen basteln
01.
%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
Bitte warten ..
Mitglied: bastla
22.08.2011, aktualisiert 18.10.2012
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 ) die entsprechende Nachfrage ...

Eine andere Nachfrage erspare ich Dir allerdings nicht, nämlich: Willst Du nicht eher einen Ordner nur mit dem Interpretennamen anlegen?
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:
01.
@echo off & setlocal 
02.
::Variable wird bei aktiver "delayedExpansion" erstellt 
03.
setlocal enabledelayedexpansion 
04.
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single).mp3" 
05.
echo !Zeile! 
06.
endlocal 
07.
::"delayedExpansion" wird erst nach Erstellung der Variablen aktiviert 
08.
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single).mp3" 
09.
setlocal enabledelayedexpansion 
10.
echo !Zeile! 
11.
endlocal 
12.
 
13.
echo\ 
14.
 
15.
::Variable wird bei aktiver "delayedExpansion" erstellt 
16.
setlocal enabledelayedexpansion 
17.
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single!).mp3" 
18.
echo !Zeile! 
19.
endlocal 
20.
::"delayedExpansion" wird erst nach Erstellung der Variablen aktiviert 
21.
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single!).mp3" 
22.
setlocal enabledelayedexpansion 
23.
echo !Zeile! 
24.
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)
01.
@echo off & setlocal enabledelayedexpansion 
02.
for /f "delims=" %%i in ('findstr/i/c:%find% %source%') do ( 
03.
    set "Ordner=%%~ni" 
04.
    set "Datei=%%~nxi" 
05.
    echo !Ordner! 
06.
    echo %%~ni 
07.
    echo !Datei! 
08.
    echo %%~nxi 
09.
    echo\ 
10.
)
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 ...
Bitte warten ..
Mitglied: Hi-Robbie
23.08.2011 um 15:39 Uhr
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!
01.
@echo off & setlocal 
02.
chcp 1252>nul 
03.
color 0a 
04.
 
05.
set find=\AUDIO.MP3 
06.
set "source=%~nx1" 
07.
set "folder=%~n1" 
08.
set "sdrive=%~d0" 
09.
set "stpath=%~p1" 
10.
set /a "nr=1" 
11.
 
12.
if not exist "%folder%" md "%folder%" 
13.
 
14.
for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do (  
15.
echo. 
16.
echo    %nr%  %%~ni 
17.
if exist "%sdrive%%%i" copy "%sdrive%%%i" "%sdrive%%stpath%%folder%\%nr%_%%~nxi" 
18.
if not exist "%sdrive%%%i" >"%sdrive%%stpath%%folder%\_%nr%_%%~ni" echo. 
19.
 
20.
set /a "nr+=1" 
21.
)
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
Bitte warten ..
Mitglied: bastla
23.08.2011 um 15:46 Uhr
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 ...
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" ) anzugeben

Grüße
bastla
Bitte warten ..
Mitglied: Hi-Robbie
23.08.2011 um 18:00 Uhr
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?

01.
 @echo off & setlocal 
02.
chcp 1252>nul 
03.
color 0a 
04.
 
05.
set find=\AUDIO.MP3 
06.
set "source=%~nx1" 
07.
set "folder=%~n1" 
08.
set "sdrive=%~d0" 
09.
set "stpath=%~p1" 
10.
set /a "nr=1" 
11.
 
12.
if not exist "%folder%" md "%folder%" 
13.
 
14.
 
15.
for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do call :ProcessLine 
16.
 
17.
goto :Ende 
18.
 
19.
:ProcessLine 
20.
setlocal enabledelayedexpansion 
21.
 
22.
echo %nr%  %%~ni 
23.
 
24.
:: if exist "%sdrive%%%i" copy "%sdrive%%%i" "%sdrive%%stpath%%folder%\%nr%_%%~nxi" >NUL 
25.
:: if not exist "%sdrive%%%i" >"%sdrive%%stpath%%folder%\_%nr%_%%~ni" Echo. 
26.
 
27.
endlocal  
28.
 
29.
set /a "nr+=1" 
30.
 
31.
goto :eof 
32.
 
33.
:Ende
Gruß
Robbie
Bitte warten ..
Mitglied: Hi-Robbie
23.08.2011 um 18:15 Uhr
Und so zählt die Nr. wider nicht mit?

01.
 @echo off & setlocal 
02.
chcp 1252>nul 
03.
color 0a 
04.
 
05.
set find=\AUDIO.MP3 
06.
set "source=%~nx1" 
07.
set "folder=%~n1" 
08.
set "sdrive=%~d0" 
09.
set "stpath=%~p1" 
10.
set /a "nr=1" 
11.
 
12.
if not exist "%folder%" md "%folder%" 
13.
 
14.
 
15.
for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do (  
16.
setlocal enabledelayedexpansion 
17.
echo. 
18.
echo    %nr%  %%~ni 
19.
 
20.
if exist "%sdrive%%%i" copy "%sdrive%%%i" "%sdrive%%stpath%%folder%\%nr%_%%~nxi" 
21.
if not exist "%sdrive%%%i" >"%sdrive%%stpath%%folder%\_%nr%_%%~ni" echo. 
22.
endlocal  
23.
 
24.
call :ProcessLine 
25.
26.
 
27.
:ProcessLine 
28.
echo Process 
29.
set /a "nr+=1" 
30.
goto :eof
Gruß
Robbie
Bitte warten ..
Mitglied: Skyemugen
23.08.2011 um 18:30 Uhr
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
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é
Bitte warten ..
Mitglied: Biber
23.08.2011 um 19:03 Uhr
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

01.
...... 
02.
REM ERSETZT ab "for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do call :ProcessLine" 
03.
for /f "delims=" %%i in (hirobbiemp3.txt) do call :ProcessLine "%%~ni" 
04.
 
05.
 
06.
goto :Ende 
07.
 
08.
:ProcessLine 
09.
setlocal enabledelayedexpansion 
10.
Set "thistitle=%~1" 
11.
Set "thistitle=%thistitle:&=^&%" 
12.
echo %nr%  %thistitle%  
13.
..... 
14.
REM ERSETZT bis "echo    %nr%  %%~ni " inklusive 
15.
....
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)
Bitte warten ..
Mitglied: bastla
23.08.2011 um 20:19 Uhr
@Biber
Der Plan wäre aber eigentlich
01.
@echo off & setlocal 
02.
set /a nr=1 
03.
for /f "delims=" %%i in (hirobbiemp3.txt) do call :ProcessLine "%%~ni" 
04.
goto :eof 
05.
 
06.
:ProcessLine 
07.
set "thistitle=%~1" 
08.
setlocal enabledelayedexpansion 
09.
echo %nr%  !thistitle! 
10.
endlocal 
11.
set /a nr+=1 
12.
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
Bitte warten ..
Mitglied: Biber
23.08.2011 um 21:28 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Findstr - code für schwieriger Abfrage gesucht (9)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
gelöst Mal eine neue Art von Abfrage mit findstr (8)

Frage von DaTobsn zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...