Alle Zeilenumbrüche in einer Textdatei entfernen. Gleichheitszeichen auch.
Hallo,
wie können alle Zeilenumbrüche in einer .txt-Datei entfernt werden?
Es geht etwa um 40 und mehrere Zeilen (je mach untersuchten Datei) auf einer einzigen Zeile zusammenstellen. Dabei dürfen keine Leerzeichen vorhanden sein.
Buchstaben, Lehrzeichen und andere sonstige Zeichen zu filtern geht es ja bekanntermaßen %var:.=%, allerdings die Zeilenumbrüche zu entfernen habe ich nach langem Ausprobieren nicht geschafft.
Ich habe mir bereits mehrere Artikel zu diesem Thema durchgelesen. Allerdings enden alle Vorschläge außerhalb einer Batch-Umgebung bzw. der Fragesteller wird mit einer anderen Lösung zufrieden gestellt.
Hier wäre etwas, was ich so als Basis aufgebaut habe – sowohl für Korrekturen als auch für Verbesserungsvorschläge bin offen und würde mich darüber sehr freuen!
Um ein Gleichheitszeichen (=) aus der .txt-Datei zu entfernen habe ich ebenso ohne Erfolg heftig geschwitzt (übrigens ich schwitze eigentlich nie, auch beim Volleyball nicht aber man sagt halt so für eine anstrengende Arbeit).
Danke schon mal an alle. Ich bin nun nach der langen anstrengenden Arbeit umso mehr gespannt, wie ihr das lösen würdet. Ich bin erstmals platt.
Gruß
evinben
wie können alle Zeilenumbrüche in einer .txt-Datei entfernt werden?
Es geht etwa um 40 und mehrere Zeilen (je mach untersuchten Datei) auf einer einzigen Zeile zusammenstellen. Dabei dürfen keine Leerzeichen vorhanden sein.
Buchstaben, Lehrzeichen und andere sonstige Zeichen zu filtern geht es ja bekanntermaßen %var:.=%, allerdings die Zeilenumbrüche zu entfernen habe ich nach langem Ausprobieren nicht geschafft.
Ich habe mir bereits mehrere Artikel zu diesem Thema durchgelesen. Allerdings enden alle Vorschläge außerhalb einer Batch-Umgebung bzw. der Fragesteller wird mit einer anderen Lösung zufrieden gestellt.
Hier wäre etwas, was ich so als Basis aufgebaut habe – sowohl für Korrekturen als auch für Verbesserungsvorschläge bin offen und würde mich darüber sehr freuen!
if exist "tmp2.txt" (del "tmp2.txt")
for /f %%e in ('findstr "," "Meine.reg"') do set "var=%%e" & set var=!var:,=! & set var=!var:\=! & set var=!var:^"DosDevicesJ:^"=! & set var=!var:hex:=! & set var=!var: =! & echo !var!>>tmp2.txt
Danke schon mal an alle. Ich bin nun nach der langen anstrengenden Arbeit umso mehr gespannt, wie ihr das lösen würdet. Ich bin erstmals platt.
Gruß
evinben
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 181095
Url: https://administrator.de/contentid/181095
Ausgedruckt am: 26.11.2024 um 04:11 Uhr
32 Kommentare
Neuester Kommentar
Aloha,
du willst also einen Bandsalat erstellen?
Was hindert dich daran, jede vorkommende Zeile in eine neue Variable zu schreiben und diese per
echo !var! !var2! !var3! in eine neue Datei zu schreiben, wobei ich mir nicht sicher bin, ob in diesem Fall ebenso die Begrenzung gilt:
*grübel*
Mal als Beispiel:
hm, wobei natürlich 40+x !VarZahl! zu schreiben ... nunja, hatten wir nicht da mal irgendwo einen Trick *grübel*
Ist eben aufwändig per Batch, m.M.n.
greetz André
du willst also einen Bandsalat erstellen?
Was hindert dich daran, jede vorkommende Zeile in eine neue Variable zu schreiben und diese per
echo !var! !var2! !var3! in eine neue Datei zu schreiben, wobei ich mir nicht sicher bin, ob in diesem Fall ebenso die Begrenzung gilt:
Ab Version 7 (WIN95) darf die Batchzeile
255 Zeichen lang sein, intern (nach Einsetzen der Variablen) sogar
1023 Zeichen (s.a. COMMAND Optionen /U und /L).
255 Zeichen lang sein, intern (nach Einsetzen der Variablen) sogar
1023 Zeichen (s.a. COMMAND Optionen /U und /L).
*grübel*
Mal als Beispiel:
set /a "Wert=0"
for /f "usebackq delims=" %%s in ("E:\Skripte\datei.txt") do (
set /a "Wert+=1"
set "Var!Wert!=%%s"
)
echo !Var1! !Var2! !Var3! !Var4!
pause
hm, wobei natürlich 40+x !VarZahl! zu schreiben ... nunja, hatten wir nicht da mal irgendwo einen Trick *grübel*
Ist eben aufwändig per Batch, m.M.n.
greetz André
Hallo evinben,
Dein erstes Problem sollte recht einfach zu lösen sein. Beim Zweiten fällt mir dann nur der "Umweg" über VBS ein.
Das ganze könnte dann etwa so aussehen:
Gruß icsAT
[EDIT]Löschen korrigiert und löschen der Ausgabe ergänzt. [/EDIT]
Dein erstes Problem sollte recht einfach zu lösen sein. Beim Zweiten fällt mir dann nur der "Umweg" über VBS ein.
Das ganze könnte dann etwa so aussehen:
setlocal
set "vbs=D:\temp\~replace.vbs"
set "eingabe=D:\temp\eingabe.txt"
set "ersetzt=D:\temp\~ersetzt.txt"
set "ausgabe=D:\temp\ausgabe.txt"
if exist %ausgabe% del %ausgabe%
echo Set fso=CreateObject("Scripting.FileSystemObject"):txt=fso.OpenTextFile("%eingabe%").ReadAll:fso.OpenTextFile("%ersetzt%",2,True).Write Replace(txt,"=","")>"%vbs%"
cscript //nologo "%vbs%"
for /f "usebackq delims=" %%a in ("%ersetzt%") do set /p=%%a<nul>>%ausgabe%
if exist %ersetzt% del %ersetzt%
if exist %vbs% del %vbs%
endlocal
goto :eof
Gruß icsAT
[EDIT]Löschen korrigiert und löschen der Ausgabe ergänzt. [/EDIT]
@icsat
Wenn schon VBS, würde ich auch gleich die Zeilenschaltungen eliminieren (und die Originaldatei überschreiben):
Grüße
bastla
Wenn schon VBS, würde ich auch gleich die Zeilenschaltungen eliminieren (und die Originaldatei überschreiben):
echo Set fso=CreateObject("Scripting.FileSystemObject"):txt=fso.OpenTextFile("%eingabe%").ReadAll:fso.CreateTextFile("%eingabe%").Write Replace(Replace(txt,"=",""),vbCrLf,"")>"%vbs%"
bastla
moin,
sollte bzw. geht auch ohne vbs
Gruß Phil
sollte bzw. geht auch ohne vbs
@echo off &setlocal disabledelayedexpansion
Prompt $g
::echo on
set "Zeichen=.,\="
rem als ersten Parameter erwartet der Batch eine Datei
if not exist "%~1" rd & exit /b 1
rem die Ausgabe erfolgt in die Datei mit extrakürzel -Neu
>"%~dpn1-Neu%~x1" (for /f "usebackqdelims=" %%i in (%1) do (set "Line=%%i"
call :Write
))
goto :eof
:Write
if not defined Line goto :eof
setlocal enabledelayedexpansion
(
for /f "tokens=1-30*delims=%Zeichen%" %%? in ("!Line: =!") do endlocal&(<nul set /p ="%%?%%@%%A%%B%%C%%D%%E%%F%%G%%H%%I%%J%%K%%L%%M%%N%%O%%P%%Q%%R%%S%%T%%U%%V%%W%%X%%Y%%Z%%[%%\"
set "Line=%%]"
)
)||endlocal&&set "Line="
goto :Write
Gruß Phil
Hallo bastla,
hatte ich kurz drüber nachgedacht. Wird in einem VBS-Einzeiler aus dem Batch heraus imho jedoch schnell ünübersichtlich, da ja nicht nur Zeilenumbruch und "=" sondern auch noch diverse andere Ersetzungen (s. Code des TE) erfolgen sollen. Das kann man dann schön in der FOR-Schleife im Batch abhandeln.
Vom Grundsatz her würde ich mich nach Möglichkeit allerdings entweder für VBS oder fürs Batch entscheiden.
Die Zwischendatei habe ich verwendet, damit die Originaldatei so bestehen bleibt und ggf. erneut verwendet werden kann.
Gruß icsAT
hatte ich kurz drüber nachgedacht. Wird in einem VBS-Einzeiler aus dem Batch heraus imho jedoch schnell ünübersichtlich, da ja nicht nur Zeilenumbruch und "=" sondern auch noch diverse andere Ersetzungen (s. Code des TE) erfolgen sollen. Das kann man dann schön in der FOR-Schleife im Batch abhandeln.
Vom Grundsatz her würde ich mich nach Möglichkeit allerdings entweder für VBS oder fürs Batch entscheiden.
Die Zwischendatei habe ich verwendet, damit die Originaldatei so bestehen bleibt und ggf. erneut verwendet werden kann.
Gruß icsAT
Moin Phil,
stimmt, es geht auch ohne. Würdest Du Dein Slash noch durch ein Backslash ersetzen wären auch unsere Ergebnisse nahezu identisch (bis auf das "hex:"), wenn ich in mein Skript noch das zusätzliche entfernen der im Ursprungspost angegebenen Zeichen hinzufüge:
Gruß icsAT
[EDIT]Ersetzen modifiziert: Es wird nicht jedes Backslash gelöscht, sondern nur die mit einem Komma davor.[/EDIT]
[EDIT]Zeile 17 nach Phil's Amerkung angepasst.[/EDIT]
stimmt, es geht auch ohne. Würdest Du Dein Slash noch durch ein Backslash ersetzen wären auch unsere Ergebnisse nahezu identisch (bis auf das "hex:"), wenn ich in mein Skript noch das zusätzliche entfernen der im Ursprungspost angegebenen Zeichen hinzufüge:
setlocal enabledelayedexpansion
set "vbs=D:\temp\~replace.vbs"
set "eingabe=D:\temp\eingabe.txt"
set "ersetzt=D:\temp\~ersetzt.txt"
set "ausgabe=D:\temp\ausgabe.txt"
if exist %ausgabe% del %ausgabe%
echo Set fso=CreateObject("Scripting.FileSystemObject"):txt=fso.OpenTextFile("%eingabe%").ReadAll:fso.OpenTextFile("%ersetzt%",2,True).Write Replace(txt,"=","")>"%vbs%"
cscript //nologo "%vbs%"
for /f "usebackq delims=" %%a in ("%ersetzt%") do (
set "line=%%a"
set "line=!line:,\=!"
set "line=!line:,=!"
set line=!line:"DosDevicesJ:"=!
set "line=!line:hex:=!"
set "line=!line: =!"
set /p="!line!"<nul>>%ausgabe%
pause
)
if exist %ersetzt% del %ersetzt%
if exist %vbs% del %vbs%
endlocal
goto :eof
Gruß icsAT
[EDIT]Ersetzen modifiziert: Es wird nicht jedes Backslash gelöscht, sondern nur die mit einem Komma davor.[/EDIT]
[EDIT]Zeile 17 nach Phil's Amerkung angepasst.[/EDIT]
Aloha,
debugging für ähm cmd'ler?
Tokens sind ja maximal 31 möglich, wenn ich mich recht erinnere, das Alphabet hat 26 Buchstaben, irgendwoher müssen ja die weiteren 5 Zeichen kommen
das
greetz André
debugging für ähm cmd'ler?
echo on
(Zeile 3 kürzen) und die batch im cmd ausgeführt (pause wäre zwischen Zeile 8 und 9 wenn dann sinnvoll)Tokens sind ja maximal 31 möglich, wenn ich mich recht erinnere, das Alphabet hat 26 Buchstaben, irgendwoher müssen ja die weiteren 5 Zeichen kommen
das
>
am Anfang verwirrt dich eventuell, weil du es dort nicht vermutest, es ist das gleiche überschreibe-alles-in-die-Datei-Symbol, das man auch ans Ende der Zeile 8 setzen könnte ))>"%~dpn1-Neu%~x1"
, wenn man es an den Anfang setzt, schleichen sich keine ungewollten Leerzeichen ein.<nul set /p
ist wieder so ein Trick 17, den der Phil in letzter Zeit auch häufiger nutzt und mir letztens mit dem Hinweis auf diesen Thread ein wenig schmackhaft gemacht hat, das <nul
am Anfang sorgt für einen fehlenden Umbruch mit dem nachfolgenden Befehl, wenn ich mich nicht irre. total abgedrehte ###e, die der Phil da wieder bastelt :D einfach nur geilgreetz André
Hallo evinben,
Beispiele, wie Deine ursprüngliche Frage (so wie sie hier verstanden wurde) zu lösen wäre hast Du ja nun bekommen.
Ich bin mir allerdings aktuell nicht sicher, ob Dich das auch zum Ziel führen wird. Ich muss gestehen ich habe Dein Vorhaben nicht vollständig verstanden:
Es ist schon klar, dass Du Registry Schlüssel und Werte in unterschiedliche Aufbereitung hast und diese vergleichbar machen willst. Ich habe allerdings nicht verstanden welcher Teil genau und mit welcher Abhängigkeit ersetzt werden soll.
Gruß icsAT
Beispiele, wie Deine ursprüngliche Frage (so wie sie hier verstanden wurde) zu lösen wäre hast Du ja nun bekommen.
Ich bin mir allerdings aktuell nicht sicher, ob Dich das auch zum Ziel führen wird. Ich muss gestehen ich habe Dein Vorhaben nicht vollständig verstanden:
Zitat von @evinben:
Es existieren REG-Dateien, in denen die Dateien der Werte richtig gesetzt sind. Allerdings der Name des Wertes stimmt mit diesem
aus der Registry nicht überein. Der Name muss also in Abhängigkeit der enthaltenen Zeichenfolge aus der REG-Datei in der
Registry richtig gesetzt werden. D. h. ein Vergleich per Batch muss durchgeführt werden und erst wenn die Bedingung nicht
erfüllt ist, soll der Wert-Name überschrieben werden.
Es existieren REG-Dateien, in denen die Dateien der Werte richtig gesetzt sind. Allerdings der Name des Wertes stimmt mit diesem
aus der Registry nicht überein. Der Name muss also in Abhängigkeit der enthaltenen Zeichenfolge aus der REG-Datei in der
Registry richtig gesetzt werden. D. h. ein Vergleich per Batch muss durchgeführt werden und erst wenn die Bedingung nicht
erfüllt ist, soll der Wert-Name überschrieben werden.
Es ist schon klar, dass Du Registry Schlüssel und Werte in unterschiedliche Aufbereitung hast und diese vergleichbar machen willst. Ich habe allerdings nicht verstanden welcher Teil genau und mit welcher Abhängigkeit ersetzt werden soll.
Gruß icsAT
@icsat
Unübersichtlich muss das nicht werden, wenn einfach noch ein Schleifchen herumgewickelt wird (und die Beschränkung auf nur eine Zeile VBS wäre ja auch selbst auferlegt ):
Hinsichtlich der Zwischendatei: Wenn eine Sicherungskopier gewünscht ist, kann diese ja genausogut vorweg im Batch erstellt werden.
Aber es gibt ja (wie auch dieser Thread wieder zeigt) genug Wege, und manche führen sogar nach Rom ...
Grüße
bastla
Unübersichtlich muss das nicht werden, wenn einfach noch ein Schleifchen herumgewickelt wird (und die Beschränkung auf nur eine Zeile VBS wäre ja auch selbst auferlegt ):
>"%vbs%" echo ToRemove=", =\"^&vbCrLf:Set fso=CreateObject("Scripting.FileSystemObject"):txt=fso.OpenTextFile("%eingabe%").ReadAll
>>"%vbs%" For i = 1 To Len(ToRemove):txt=Replace(txt,Mid(ToRemove,i,1),""):Next:fso.CreateTextFile("%eingabe%").Write txt
Vom Grundsatz her würde ich mich nach Möglichkeit allerdings entweder für VBS oder fürs Batch entscheiden.
Jein - "best of both worlds" ist für mich auch kein schlechter Ansatz ...Hinsichtlich der Zwischendatei: Wenn eine Sicherungskopier gewünscht ist, kann diese ja genausogut vorweg im Batch erstellt werden.
Aber es gibt ja (wie auch dieser Thread wieder zeigt) genug Wege, und manche führen sogar nach Rom ...
Grüße
bastla
hallo evinben,
Funktionsweise ist auch wie gewollt.
Böse Zungen Behaupten dann immer und immer wieder es würde zu Problemen kommen, wenn eine ungerade Anzahl von AnführungsZeichen und solche SonderZeichen wie ampersand & pipe | und ausrufezeichen und Klammern etc. in dem Text vorkommen.
Das ist Natürlich vöööllig falsch.
wenn die Ausgabe dieser Zeichenketten über delayedexpansion und erweiterter Variablendarstellung oder über For Variablen und inaktiver delayed Funktion geschieht ist nichts dergleichen zu befürchten.
Oder um Biber zu zitieren:
So - genug abgeschweift.
Der Batch erwartet die Datei als Paramter. ich hab noch zwei kommentarzeilen eingefügt.
@andrè <nul ist eine eingabeumleitung des Gerätes nul in den Befehl und bringt jede menge simulierte "Eingabetasten"
@ icsAT in Zeile 17 benutzt Du Zweimal ein caret
zwischen den ersten und dem Zweiten Anführungszeichen kannst Du das caret nicht zum deMaskieren verwenden, weil das erste Anführungszeichen schon eine Maskierungsfunktion hat - dadurch bleibt dieses caret bestehen.
das zweite caret muss Verdoppelt werden, wenn es deMaskieren soll.
wenn ich davon ausgehe, Du willst einen String
entfernen brauchst Du Keine carets benutzen. Hier kannst Du sogar die Umschliesenden Set Anführungszeichen weglassen, um eventuelle Sonderzeichen zwischen den Anführunszeichen der Ersetzsetzung zu maskieren.
Gruß Phil
danke erstmals für den Aufwand. War es schwer zu lösen oder leicht und wusstest du es bereits? Es freut mich zu hören, dass es auch mit Batch klappt.
also Aufwand ist das ja überhaupt keiner.Funktionsweise ist auch wie gewollt.
Böse Zungen Behaupten dann immer und immer wieder es würde zu Problemen kommen, wenn eine ungerade Anzahl von AnführungsZeichen und solche SonderZeichen wie ampersand & pipe | und ausrufezeichen und Klammern etc. in dem Text vorkommen.
Das ist Natürlich vöööllig falsch.
wenn die Ausgabe dieser Zeichenketten über delayedexpansion und erweiterter Variablendarstellung oder über For Variablen und inaktiver delayed Funktion geschieht ist nichts dergleichen zu befürchten.
Oder um Biber zu zitieren:
"Batch kann alles. Ausser Kaffe kochen."
So - genug abgeschweift.
Der Batch erwartet die Datei als Paramter. ich hab noch zwei kommentarzeilen eingefügt.
@andrè <nul ist eine eingabeumleitung des Gerätes nul in den Befehl und bringt jede menge simulierte "Eingabetasten"
@ icsAT in Zeile 17 benutzt Du Zweimal ein caret
set "line=!line:^"DosDevicesJ:^"=!"
das zweite caret muss Verdoppelt werden, wenn es deMaskieren soll.
wenn ich davon ausgehe, Du willst einen String
"DosDevices:"
Gruß Phil
[OT]
@ph
Kleine Korrektur : Vorhandensein einer Internetverbindung per Batch pruefen, ...
Grüße
bastla
[/OT]
@ph
Kleine Korrektur : Vorhandensein einer Internetverbindung per Batch pruefen, ...
Grüße
bastla
[/OT]
Nabend bastla,
Gruß icsAT
Zitat von @bastla:
Aber es gibt ja (wie auch dieser Thread wieder zeigt) genug Wege, und manche führen sogar nach Rom ...
Dein Wort in Gottes Gehörgang und hoffentlich führen die aufgezeigten Wege wirklich nach Rom und nicht etwa nach Athen oder so Aber es gibt ja (wie auch dieser Thread wieder zeigt) genug Wege, und manche führen sogar nach Rom ...
Gruß icsAT
[OT]
Hallo bastla,
wenn Bieber der Meinung ist außer Brotscheiden würde alles mit Batch funktionieren und Du damit Phil's Aussage bezüglich Kaffee kochen korrigierst bedeutet das für mich im Ergebnis: Kaffee kochen per Batch geht!
Wären Bieber oder Du bitte so freundlich das entsprechende Skript mal zu posten oder soll ich dafür besser einen extra Thread aufmachen.
Das würde mir so unendlich viele Morgende retten
Gruß icsAT
[/OT]
[EDIT]Dem Biber das erste e geklaut.[/EDIT]
Hallo bastla,
wenn Bieber der Meinung ist außer Brotscheiden würde alles mit Batch funktionieren und Du damit Phil's Aussage bezüglich Kaffee kochen korrigierst bedeutet das für mich im Ergebnis: Kaffee kochen per Batch geht!
Wären Bi
Das würde mir so unendlich viele Morgende retten
Gruß icsAT
[/OT]
[EDIT]Dem Biber das erste e geklaut.[/EDIT]
[still OT]
@icsat
Poste doch bitte einmal Deine Hardware-Konfiguration und das verwendete BS (Brühsystem).
Grüße
bastla
P.S.: Biber hat das zweite "e" in seinem Nick schon vor Längerem irgend so einem Schlagerfuzzi gespendet ...
[/still OT]
@icsat
Wären Bieber oder Du bitte so freundlich das entsprechende Skript mal zu posten oder soll ich dafür besser einen extra Thread aufmachen.
Dass jetzt auch schon von Dir unvollständige Anfragen kommen, hätte ich eigentlich nicht erwartet ... Poste doch bitte einmal Deine Hardware-Konfiguration und das verwendete BS (Brühsystem).
Grüße
bastla
P.S.: Biber hat das zweite "e" in seinem Nick schon vor Längerem irgend so einem Schlagerfuzzi gespendet ...
[/still OT]
[ein letzter OT für diesen Thread]
Hallo bastla,
sorry dass meine Anfrage so unvollständig war, aber ich mach den ganzen Tag echt wichtige Sachen und hab das hier nur mal eben so nebenbei geschrieben. Weil Ihr ja die Gurus seid, dachte ich ihr wüsstet schon was ich erwarte und könntet mein Problem mal eben schnell lösen.
Wir benötigen hier dringend einen Batch zum Kaffeekochen. Toll wäre es, wenn der Brühvorgang etwa abgeschlossen wäre, sobald ich mein Auto auf dem Parkplatz abgestellt habe.
Ach ja, eine E-Mail Benachrichtigung an unsere Einkaufsabteilung bei Rohstoffmangel wäre auch nicht verkehrt.
Mit unserer Hardware kenne ich mich eigentlich gar nicht so gut aus. Unser Dienstleister sagt immer ich soll mir darüber keine Gadanken machen solange meine Software darauf schnell genug läuft und einfach pünktlich die Rechnungen bezahlen. Aber ich versuche es dennoch:
Beim BS verlassen wir uns primär auf "(Kaffee) Luke eXPerimental" aber es wäre gut, wenn es auch auf neueren Versionen des BS laufen würde um für die Zukunft richtig aufgestellt zu sein.
Zum Abschluss nun noch eine Anmerkung in eigener Sache:
Ich mache keine orthographischen Fehler, es handelt sich nur eine freie bzw. meine Interpretation der neuen deutschen Rechtschreibung!
Ich muss allerdings eingestehen, dass es sich beim "Biber" um einen Eigennamen handelt, der verflucht noch mal korrekt zu schreiben ist und keinen Raum zur Interpretation bietet.
Entschuldige bitte "Biber"!
In diesem Sinne: Allen eine angenehme Nachtruhe.
Gruß icsAT
[/ein letzter OT für diesen Thread]
Zitat von @bastla:
Dass jetzt auch schon von Dir unvollständige Anfragen kommen, hätte ich eigentlich nicht erwartet ...
Poste doch bitte einmal Deine Hardware-Konfiguration und das verwendete BS (Brühsystem).
Dass jetzt auch schon von Dir unvollständige Anfragen kommen, hätte ich eigentlich nicht erwartet ...
Poste doch bitte einmal Deine Hardware-Konfiguration und das verwendete BS (Brühsystem).
Hallo bastla,
sorry dass meine Anfrage so unvollständig war, aber ich mach den ganzen Tag echt wichtige Sachen und hab das hier nur mal eben so nebenbei geschrieben. Weil Ihr ja die Gurus seid, dachte ich ihr wüsstet schon was ich erwarte und könntet mein Problem mal eben schnell lösen.
Wir benötigen hier dringend einen Batch zum Kaffeekochen. Toll wäre es, wenn der Brühvorgang etwa abgeschlossen wäre, sobald ich mein Auto auf dem Parkplatz abgestellt habe.
Ach ja, eine E-Mail Benachrichtigung an unsere Einkaufsabteilung bei Rohstoffmangel wäre auch nicht verkehrt.
Mit unserer Hardware kenne ich mich eigentlich gar nicht so gut aus. Unser Dienstleister sagt immer ich soll mir darüber keine Gadanken machen solange meine Software darauf schnell genug läuft und einfach pünktlich die Rechnungen bezahlen. Aber ich versuche es dennoch:
- MotherBoard: ist aktuell nicht vorhanden, da in der Firma absoluter Damenmangel herscht (sonst könnte das Problem ja auch organisatorisch gelöst werden )
- Festplatte: Länge: 126 cm, Tiefe: 62 cm, Stärke: 3.8 cm
- Grafikkarte: Die Karte mit den Piktogrammen zur Bedienung hat leider gerade jemand verlegt ;-(
- Arbeitsspeicher: ca. 2 x 1,3 l
- Floppy: Schlapp sind wir nur vor dem ersten Kaffee
- Prozessor: Auch die Fähigkeit unseres Denkapparates steht in direktem Verhältnis zum konsumierten Kaffee
Beim BS verlassen wir uns primär auf "(Kaffee) Luke eXPerimental" aber es wäre gut, wenn es auch auf neueren Versionen des BS laufen würde um für die Zukunft richtig aufgestellt zu sein.
Zum Abschluss nun noch eine Anmerkung in eigener Sache:
Ich mache keine orthographischen Fehler, es handelt sich nur eine freie bzw. meine Interpretation der neuen deutschen Rechtschreibung!
Ich muss allerdings eingestehen, dass es sich beim "Biber" um einen Eigennamen handelt, der verflucht noch mal korrekt zu schreiben ist und keinen Raum zur Interpretation bietet.
Entschuldige bitte "Biber"!
In diesem Sinne: Allen eine angenehme Nachtruhe.
Gruß icsAT
[/ein letzter OT für diesen Thread]
Moin evinben,
Mannomann jetzt hätte ich doch gleich ins Mikro gebissen. Da hat doch die Spracherkennung einen Link auf der Webseite ausgewählt, anstatt das Wort zu schreiben.
Nu war natürlich der ganze Text wieder wech. Dann fange ich eben noch mal von vorne an.
[OT]
Quelle: http://de.wikipedia.org/wiki/Gravis_(Typografie)#Informatik
[OT]
zu 1.
Zu Beginn des Batches schalte ich ja explizit die Verzögerung aus. Wenn der Inhalt von For-Variablen mit Ausrufezeichen ist, werden diese nur bei ausgeschaltener Verzögerung mit ausgegeben.
Ja - mit goto :EOF würde ein in dieser Instanz zugehöriges Setlocal auch mit Parametern beendet werden.
Damit ich aber an die verzögert aufgelöste Variable komme, muss auch die Verzögerung aktiviert sein.
Die EingabeUmleitung von nichts <nul (simulierte Eingabetaste(n)) ist doch für:
gedacht.
zu 2.
Tja, wenn ich den Textinhalt nicht kenne muss ich damit rechnen, dass folgendes in einer Zeile steht:
Dieser Text würde nun in der Variable stehen, aber die For-Schleife löst nicht aus. Deswegen steht die For-Schleife in einer Klammer und wird bei nicht Auslösen den folgenden Befehl Endlocal sowie das Löschen der Variable vornehmen.
zu 3.
Habe ich schon bei Erstens beschrieben, dass simulierte Enter bestätigt nur den/die zugehörigen Befehl(e).
Genauso wie ein Echo (zeilenweise Ausgabe) kann auch eine aneinander gereihte Ausgabe (ohne Zeilenumbruch) beliebig umgeleitet werden, oder auch nur auf der CMD-Line ausgegeben werden.
Zu 4.
Ich ja schon weiter oben bemerkte befindet sich das Caret zwischen Anführungszeichen. Das Caret selber kann zwischen diesen Anführungszeichen nicht zum Maskieren benutzt werden.
Habe ich hier auch schon beschrieben HowTo For Schleife mit TokenTrenner AnführungsZeichen ( double quotes as Delimiter ).
Der Umstand, dass diese Variable nicht verzögert aufgelöst wird ist eine andere Sache, aber dort ähnlich.
Nimm das zu entfernende Anführungszeichen vor der For-Schleife noch einmal in die Variable auf.
Einen passenden CMD-Line-One-Liner speziell für Reg: (dieser ist aber Grotten-langsam)
Gruß Phil
Mannomann jetzt hätte ich doch gleich ins Mikro gebissen. Da hat doch die Spracherkennung einen Link auf der Webseite ausgewählt, anstatt das Wort zu schreiben.
Nu war natürlich der ganze Text wieder wech. Dann fange ich eben noch mal von vorne an.
[OT]
Aloha Phil warum schreiben T-Mo und du eigentlich immer das é falsch,
Vielleicht sind wir die einzigen, welche deinen Namen ausschreiben. Etwas zur Verwirrung (extra für Biber aufgelesen) 0.Informatik [Bearbeiten]In der Informatik wird das alleinstehende Zeichen fachsprachlich als Backtick oder Backquote (engl. für „rückwärts geneigtes Hochkomma“ bzw. „einfaches Anführungszeichen“) bezeichnet und paarweise zur Klammerung etwa von Bezeichnern (MySQL) oder eingebetteten Kommandozeilenbefehlen (Unix-Shell, Perl etc.) verwendet.
[OT]
zu 1.
Zu Beginn des Batches schalte ich ja explizit die Verzögerung aus. Wenn der Inhalt von For-Variablen mit Ausrufezeichen ist, werden diese nur bei ausgeschaltener Verzögerung mit ausgegeben.
Ja - mit goto :EOF würde ein in dieser Instanz zugehöriges Setlocal auch mit Parametern beendet werden.
Damit ich aber an die verzögert aufgelöste Variable komme, muss auch die Verzögerung aktiviert sein.
Die EingabeUmleitung von nichts <nul (simulierte Eingabetaste(n)) ist doch für:
Set /P "=Text der angezeigt wird, bevor der Wert in die Variable aufgenommen wird. "
zu 2.
Tja, wenn ich den Textinhalt nicht kenne muss ich damit rechnen, dass folgendes in einer Zeile steht:
,= \
zu 3.
Habe ich schon bei Erstens beschrieben, dass simulierte Enter bestätigt nur den/die zugehörigen Befehl(e).
Genauso wie ein Echo (zeilenweise Ausgabe) kann auch eine aneinander gereihte Ausgabe (ohne Zeilenumbruch) beliebig umgeleitet werden, oder auch nur auf der CMD-Line ausgegeben werden.
Zu 4.
Ich ja schon weiter oben bemerkte befindet sich das Caret zwischen Anführungszeichen. Das Caret selber kann zwischen diesen Anführungszeichen nicht zum Maskieren benutzt werden.
Habe ich hier auch schon beschrieben HowTo For Schleife mit TokenTrenner AnführungsZeichen ( double quotes as Delimiter ).
Der Umstand, dass diese Variable nicht verzögert aufgelöst wird ist eine andere Sache, aber dort ähnlich.
Nimm das zu entfernende Anführungszeichen vor der For-Schleife noch einmal in die Variable auf.
set Line=!Line:"=!
Einen passenden CMD-Line-One-Liner speziell für Reg: (dieser ist aber Grotten-langsam)
for /f "tokens=*delims=" %i in ('find "," ^<"D:\Ordner\Reg.reg"') do @for %j in (%i) do @for /f "tokens=*Delims=hex:" %k in ("%j") do @if %k geq 0 <nul set /p ="%k"
Gruß Phil
Hallo evinben,
hier mal der Versuch von Antworten zu Deinen Frage:
1. "setlocal" wird in der Subroutine verwendet, damit die Variable "Line" verändert werden kann, ohne dass diese Änderung auf den aufrufenden Teil wirkt. "enabledelayedexpansion" hat Phil zum aktivieren der verzögerten Erweiterung von Umgebungsvariablen verwendet, damit "Line" in "!" aufgelöst werden kann. IMHO hätte an dieser Stelle darauf verzichtet werden können und Statt der "!" hätten "%" verwendet werden können.
2. Das müsste Phil Dir beantworten, was er sich dabei gedacht hat. Er will mit Sicherheit für einen bestimmten Fall der sich mir gerade nicht erschließt dort eine Abbruchbedingung für die Zeile
schaffen. Ich stimme mit Dir jedoch überein, dass das Löschen der Variable nicht erreicht wird.
3. "<NUL" ist ja die Eingabe für den "set /p". Die Ausgabe, welche dann ohne Zeilenumbruch in eine Datei umgeleitet wird, baust Du Dir ja aus vorhandenen Variablen zusammen. Mir fällt keine Möglichkeit ein die Ausgabe des "set /p" direkt in eine Variable zu schreiben aber Du kannst Dir aus vorhandenen natürlich ohne den Schalter "/p" auch eine neue Zusammenbauen (bis zur Größengrenze von Variablen).
4. Da stehen keine Anführungszeichen zur Suche drin IMHO ist es nicht möglich, das Anführungszeichen als Trennzeichen in der FOR-Schleife zu verwenden. Ich lasse mich aber gerne eines besseren belehren
Gruß icsAT
[EDIT]Oh, Phil war schneller, blödes Multitasking.[/EDIT]
hier mal der Versuch von Antworten zu Deinen Frage:
1. "setlocal" wird in der Subroutine verwendet, damit die Variable "Line" verändert werden kann, ohne dass diese Änderung auf den aufrufenden Teil wirkt. "enabledelayedexpansion" hat Phil zum aktivieren der verzögerten Erweiterung von Umgebungsvariablen verwendet, damit "Line" in "!" aufgelöst werden kann. IMHO hätte an dieser Stelle darauf verzichtet werden können und Statt der "!" hätten "%" verwendet werden können.
2. Das müsste Phil Dir beantworten, was er sich dabei gedacht hat. Er will mit Sicherheit für einen bestimmten Fall der sich mir gerade nicht erschließt dort eine Abbruchbedingung für die Zeile
if not defined Line goto :eof
3. "<NUL" ist ja die Eingabe für den "set /p". Die Ausgabe, welche dann ohne Zeilenumbruch in eine Datei umgeleitet wird, baust Du Dir ja aus vorhandenen Variablen zusammen. Mir fällt keine Möglichkeit ein die Ausgabe des "set /p" direkt in eine Variable zu schreiben aber Du kannst Dir aus vorhandenen natürlich ohne den Schalter "/p" auch eine neue Zusammenbauen (bis zur Größengrenze von Variablen).
4. Da stehen keine Anführungszeichen zur Suche drin IMHO ist es nicht möglich, das Anführungszeichen als Trennzeichen in der FOR-Schleife zu verwenden. Ich lasse mich aber gerne eines besseren belehren
Gruß icsAT
[EDIT]Oh, Phil war schneller, blödes Multitasking.[/EDIT]
Ach, die ~50 Minuten, die Phil eher gepostet hat Dabei sein ist alles ^__^
Immerhin hast du bei 4. mal etwas dazugelernt
[/Bonus-OT zur Richtigstellung]
Moin evinben, pieh-ejdsch, Skye, icsAT und bastla,
bevor weitere Wellen entstehen um den Disput "Kann ein Batch besser Brot backen als Kaffee kochen?", versuche ich mal ein wenig Diesel in die Wogen (oder war das Butter auf die Fische?) zu reiben.
Damals, kurz nach der Erfindung der Alufolie, als ich die oben von bastla verlinkten Zitate geschrieben habe, lag wirklich der Verdacht nahe, das GUI-basierende Systeme besser zum Brotschneiden geeignet wären als Batch.
Damals war für mich absolut klar: Spätestens nach den legendären "Flying Toasters"-Modulen der After Dark-Entwickler (ürsprünglich für den Mac entwickelt) war der gesamte brotverarbeitende Bereich unwiderruflich für alle Batch-Puristen verloren.
Wie sagte seinerzeit Patrick Beard, einer der After-Dark-Entwickler:
Dem kann ein Batchschnipsel wenig entgegensetzen.
Ich hoffe, so wird der Kontext des Brotschneide-Vergleichs deutlicher.
Andererseits....
Inzwischen hat sich ja die Welt ein paar Male weitergedreht.
Bei vielen Kidz ist "Windows" leider schon fast ein Synonym für "Graphische Oberfläche".
Und bei diesen Redmonder GUI-Meuchlern hätte ich zwar ein paar "Brot"-Assoziationen.
Allerdings mehr ehrabschneidend als brotabschneidend.
Diese Jungs & Mädels bekommen ja nun nicht gerade alles gebacken und könnten sich eher bei seriösen Bätschern hier im Forum eine Scheibe abschneiden.
Wiederum andererseits....
Wenn ich hier, speziell im Bereich "Batch & Shell" mitverfolge, wie ausgekocht, wie abgebrüht und wie magenschonend hier Batchprobleme gelöst werden...
--> dann muss ich sagen: Bätche und Kaffeemaschinen könnten auch durchaus gemeinsame Vorfahren haben.
Okay, auch die vielen "wiederholten Aufgüsse" und die oft bestellten "bastla to go"-Bestellungen sprechen für eine gewisse Seelenverwandtschaft.
Kurz gesagt: heute würde ich nicht mehr ausschliessen, dass Batch zum Kaffeekochen und/oder zum Brotschneiden geeignet ist.
Grüße
Biber
P.S. @bastla
[/Bonus-OT zur Richtigstellung]
Moin evinben, pieh-ejdsch, Skye, icsAT und bastla,
bevor weitere Wellen entstehen um den Disput "Kann ein Batch besser Brot backen als Kaffee kochen?", versuche ich mal ein wenig Diesel in die Wogen (oder war das Butter auf die Fische?) zu reiben.
Damals, kurz nach der Erfindung der Alufolie, als ich die oben von bastla verlinkten Zitate geschrieben habe, lag wirklich der Verdacht nahe, das GUI-basierende Systeme besser zum Brotschneiden geeignet wären als Batch.
Damals war für mich absolut klar: Spätestens nach den legendären "Flying Toasters"-Modulen der After Dark-Entwickler (ürsprünglich für den Mac entwickelt) war der gesamte brotverarbeitende Bereich unwiderruflich für alle Batch-Puristen verloren.
Wie sagte seinerzeit Patrick Beard, einer der After-Dark-Entwickler:
"Patrick: I liked how you could adjust the brownness of the toast."
Dem kann ein Batchschnipsel wenig entgegensetzen.
Ich hoffe, so wird der Kontext des Brotschneide-Vergleichs deutlicher.
Andererseits....
Inzwischen hat sich ja die Welt ein paar Male weitergedreht.
Bei vielen Kidz ist "Windows" leider schon fast ein Synonym für "Graphische Oberfläche".
Und bei diesen Redmonder GUI-Meuchlern hätte ich zwar ein paar "Brot"-Assoziationen.
Allerdings mehr ehrabschneidend als brotabschneidend.
Diese Jungs & Mädels bekommen ja nun nicht gerade alles gebacken und könnten sich eher bei seriösen Bätschern hier im Forum eine Scheibe abschneiden.
Wiederum andererseits....
Wenn ich hier, speziell im Bereich "Batch & Shell" mitverfolge, wie ausgekocht, wie abgebrüht und wie magenschonend hier Batchprobleme gelöst werden...
--> dann muss ich sagen: Bätche und Kaffeemaschinen könnten auch durchaus gemeinsame Vorfahren haben.
Okay, auch die vielen "wiederholten Aufgüsse" und die oft bestellten "bastla to go"-Bestellungen sprechen für eine gewisse Seelenverwandtschaft.
Kurz gesagt: heute würde ich nicht mehr ausschliessen, dass Batch zum Kaffeekochen und/oder zum Brotschneiden geeignet ist.
Grüße
Biber
P.S. @bastla
P.S.: Biber hat das zweite "e" in seinem Nick schon vor Längerem irgend so einem Schlagerfuzzi gespendet ...
Jepp, und seitdem fangen die Mädels zu kreischen an, sobald er die Bühne betritt [/Bonus-OT zur Richtigstellung]
Wenn du tatsächlich Reg-Dateien benutzt, sind diese im Unicode Format.
Normal konvertieren die Befehle more; type und find Dateien im Unicode Format die Ausgabe ins Ansi Format. Findstr hingegen reicht das Format der eingabe Datei an die Ausgabe durch (wenn es denn durch die Datei kommt).
Eine For-Schleife kann aber selbstständig die Dateien im Unicode Format nicht lesen, daher muss einer dieser Befehle die Ausgabe der Datei ins Ansi Format bringen.
Hier schon zu erkennen dass die Datei "test" im Ansi Format vorliegt, ist auch nur die halbe größe von der "Datei.reg"
Näheres beschreibt SET
Gruß Phil
Normal konvertieren die Befehle more; type und find Dateien im Unicode Format die Ausgabe ins Ansi Format. Findstr hingegen reicht das Format der eingabe Datei an die Ausgabe durch (wenn es denn durch die Datei kommt).
Eine For-Schleife kann aber selbstständig die Dateien im Unicode Format nicht lesen, daher muss einer dieser Befehle die Ausgabe der Datei ins Ansi Format bringen.
>type D:\Test\Datei.reg
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Control Panel\Mouse]
"ActiveWindowTracking"=dword:00000000
"Beep"="No"
"DoubleClickHeight"="4"
"DoubleClickSpeed"="500"
"DoubleClickWidth"="4"
"ExtendedSounds"="No"
"MouseHoverHeight"="4"
"MouseHoverTime"="400"
"MouseHoverWidth"="4"
"MouseSensitivity"="10"
"MouseSpeed"="1"
"MouseThreshold1"="6"
"MouseThreshold2"="10"
"MouseTrails"="0"
"SmoothMouseXCurve"=hex:00,00,00,00,00,00,00,00,15,6e,00,00,00,00,00,00,00,40,\
01,00,00,00,00,00,29,dc,03,00,00,00,00,00,00,00,28,00,00,00,00,00
"SmoothMouseYCurve"=hex:00,00,00,00,00,00,00,00,b8,5e,01,00,00,00,00,00,cd,4c,\
05,00,00,00,00,00,cd,4c,18,00,00,00,00,00,00,00,38,02,00,00,00,00
"SnapToDefaultButton"="0"
"SwapMouseButtons"="0"
>find "," < D:\Test\Datei.reg
"SmoothMouseXCurve"=hex:00,00,00,00,00,00,00,00,15,6e,00,00,00,00,00,00,00,40,\
01,00,00,00,00,00,29,dc,03,00,00,00,00,00,00,00,28,00,00,00,00,00
"SmoothMouseYCurve"=hex:00,00,00,00,00,00,00,00,b8,5e,01,00,00,00,00,00,cd,4c,\
05,00,00,00,00,00,cd,4c,18,00,00,00,00,00,00,00,38,02,00,00,00,00
>type D:\Test\Datei.reg>test
>dir Datei.reg test
Datenträger in Laufwerk D: ist Daten
Volumeseriennummer: 8C90-524D
Verzeichnis von D:\Test\
28.02.2012 19:32 1.530 Datei.reg
1 Datei(en), 1.530 Bytes
Verzeichnis von D:\Test\
28.02.2012 19:37 764 test
1 Datei(en), 764 Bytes
0 Verzeichnis(se), 85.394.669.568 Bytes frei
Oder funktioniert die Umleitung nur in eine Datei, als etwa nur wie folgt?
Ob du eine Ausgabeumleitung vornimmst oder nicht spielt keine Rolle.Näheres beschreibt SET
set/?|findstr "e] /P ev in."
Gruß Phil
Hallo evinben,
neben dem von Phil empfohlenem lesen der Hilfe hilft das ausprobieren diverser Varianten mir teilweise zum Verständnis:
Ich hoffe es hilft zum Verständnis von "set /p" und zum Verstehen, dass "<nul", wie Phil bereits geschrieben hat, nichts mit der Umleitung in eine Datei zu tun hat.
Die Umleitung der Ausgabe in eine Datei erfolgt in Phil's Skript durch:
Ich bin mir jetzt nicht sicher, warum Phils CMD-Line-One-Liner bei Dir nicht funktioniert. Könnte es daran liegen, dass Du diesen versuchst im Batch auszuführen? Dann müsste es:
lauten, ansonsten würde ich denken, dass der läuft.
Gruß icsAT
neben dem von Phil empfohlenem lesen der Hilfe hilft das ausprobieren diverser Varianten mir teilweise zum Verständnis:
@echo off
set /p ="1 ohne Variable, eine Eingabe wird erwartet: "
echo Deine Eingabe kann nicht weiter verwendet werden.
echo.
set /p var2="2 mit Variable, eine Eingabe wird erwartet: "
echo Deine Eingabe "%var2%" kann weiter verwendet werden
echo.
<nul set /p ="3 ohne Variable, eine Eingabe wird nicht erwartet, da diese automatisch erfolgt: "
echo.
echo Es wird keine Variable gesetzt, daher kann keine Verwendet werden.
echo.
set /p var4="4 mit Variable, eine Eingabe wird nicht erwartet, da diese automatisch erfolgt (Es ist auch egal ob <nul vor oder nach dem set angegben wird): "<nul
echo.
if not defined var4 (echo Die Variable var4="%var4%" koennte weiter verwendet werden, wenn diese nicht automatische mit NUL versorgt worden waere.) else (echo Der Inhalt der Variablen var4 lautet %var4%)
echo.
echo Beispiel 3 und 4 machen eigentlich keinen Sinn, da wir die Ausgaben ja genau so gut mit Echo erhalten haetten.
echo.
echo Wir machen es uns allerdings zu Nutzen, dass der Unterschied zum echo der Fehlende Zeilenumbruch ist.
echo Ohne meine Zwischenechos haette das Ergebnis für 3+4 naemlich etwas anders ausgesehen:
echo.
<nul set /p ="3 ohne Variable, eine Eingabe wird nicht erwartet, da diese automatisch erfolgt: "
set /p var4="4 mit Variable, eine Eingabe wird nicht erwartet, da diese automatisch erfolgt (Es ist auch egal ob <nul vor oder nach dem set angegben wird): "<nul
echo.
echo.
echo Wird bei 1+2 durch die manuelle Eingabe und Bestaetigung mit Return/Enter noch ein Zeilenumbruch forciert, faellt dieser bei 3+4 durch Nutzung von "<nul" weg.
echo.
pause
Die Umleitung der Ausgabe in eine Datei erfolgt in Phil's Skript durch:
>"%~dpn1-Neu%~x1" (
Ich bin mir jetzt nicht sicher, warum Phils CMD-Line-One-Liner bei Dir nicht funktioniert. Könnte es daran liegen, dass Du diesen versuchst im Batch auszuführen? Dann müsste es:
for /f "tokens=*delims=" %%i in ('find "," ^<"D:\Ordner\Reg.reg"') do @for %%j in (%%i) do @for /f "tokens=*Delims=hex:" %%k in ("%%j") do @if %%k geq 0 <nul set /p ="%%k"
Gruß icsAT
moin Mäddelzzz...
Gruß
- Außer man(n) kennt den /ascii Parameter von regedit....
> regedit /a mounted.devices.reg HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
> find "\" mounted.devices.reg
---------- MOUNTED.DEVICES.REG
[HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices]
Gruß