evinben
Goto Top

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!
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  
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

Content-ID: 181095

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

Ausgedruckt am: 26.11.2024 um 04:11 Uhr

Skyemugen
Skyemugen 27.02.2012 um 08:36:08 Uhr
Goto Top
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:
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).

*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é
evinben
evinben 27.02.2012 um 09:53:13 Uhr
Goto Top
Hallo André,

danke dir ;). Wäre letztendlich deiner Bandsalat nicht länger? In deinem Code beim echo muss ich dann alle Variablen nacheinander stellen und diese mit 3 multiplizieren, um das Zeichen “,“, das Zeichen “\“ und das Zeichen “ “ aus den verarbeiteten Zeilen der .txt-Datei herausfiltern zu können. Oder hattest du da an eine intelligentere Methode für die Weiterverarbeitung bereits gedacht und welche wäre diese?
Zu echo 40x Variablen könnte ich mir einen neuen Trick mit einem Automatismus, der die Variablen selbst hochschaukelt, verkraften… und freue mich schon sehr darauf.
Eventuell Vorschläge von jemandem da an der hinteren Reihe?

So, und jetzt von der Syntax-Schönheit zurück auf die wesentlichen beiden Problemen wieder:
1. Zeilenumbrüche und
2. Gleichheitszeichen entfernen

Hmm… was könnte ich denn noch ausprobieren?

Gruß
evinben
icsat
icsat 27.02.2012 um 11:15:45 Uhr
Goto Top
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:
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]
bastla
bastla 27.02.2012 um 12:21:35 Uhr
Goto Top
@icsat
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%"
Grüße
bastla
evinben
evinben 27.02.2012 um 13:32:54 Uhr
Goto Top
Hallo icsAT,
hallo bastla,

danke für die Vorschläge. So wie es aussieht gibt es anscheinend kaum Auswege, als doch über VBS umzuleiten.
Ich erkläre einfach mein Vorhaben, so wie es ist, vielleicht habt ihr Lösungen, die dafür optimal wären.
Es ist folgendes:

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 die 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 Name des Wertes (in der Registrierung) überschrieben werden.
Wenn allerdings mit
 reg query [HKLM\System... /v  "\\Beispeil\\U:"]  
die Zeichenfolge des zu vergleichenden Wertes ausgelesen wird, dann erfolgt ihre Ausgabe wie folgt ohne Kommas, Backslash, Zeilenumbrüchen und Lehrzeichen:

"\\Beispeil\\U:"=hex:5f003f003f005f00550053004200530054004f00520023004400690073006b002600560065006e005f00736e………………

In einer REG-Datei wird dieselbe Zeichenfolge dagegen wie folgt exportiert:
 [HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices]
"\\Beispiel\\U:"=hex:5f,00,3f,00,3f,00,5f,00,55,00,53,00,42,00,53,00,54,00,4f,\  
  00,52,00,23,00,44,00,69,00,73,00,6b,00,26,00,56,00,65,00,6e,00,5f,00,73,6e,\
  75,71,6c,65,69,77,79,61,73,78,6c,6c,6b,6b,6e,73,6b,69,65,70,6c,6d,6e,6b,72,\
  69,77,75,73,69,69,73,69,69,64,65,72,75,71,70,6d,6e,62,79,6d,61,6b,61,69,69,\
  65,67,65,74,66,66,73,65,69,69,71,73,61,74,74,65,72,6f,7a,64,74,65,6e,73,68,\
  65,63,68,65,6b,69,61,71,2e,73,64,77,2e,2e,2e,2e,2e,2e,2e,2e,2e,2e,2e,2e,64,\
  73,6f,6f,6f,65,75,73,62,2e,2e,2e,2e,2e,75,73,62,5f,5f,73,74,6f,72,61,67,65,\
  2e,2d,2d,2d,2d,2d,2d,57,61,73,20,73,75,63,68,73,74,20,64,75,20,68,69,65,72,\
  3f,20,69,77,79,61,73,78,6c,6c,6b,6b,6e,73,6b,69,65,70,6c,6d,6e,6b,72,69,77,\
  75,73,69,69,73,69,69,64,65,72,75,71,70,6d,6e,62,79,6d,61,6b,61,69,69,65,67,\
  65,74,66,66,73,65,69,69,71,73,61,74,74,65,72,6f,7a,64,74,65,6e,73,68,65,63,\
  68,65,6b,69,61,71,2e,73,64,77,2e,2e,2e,2e,2e,2e,2e,2e,2e,2e,2e,2e,64,73,6f,\
  6f,6f,65,75,73,62,2e,2e,2e,2e,2e,62,79,6d,61,6b,61,69,69,65,67,65,74,2e,64,\
  73,6f,6f,6f,65,75,73,62,2e,2e,2e,2e,2e,62,79,6d,61,6b,61,69,69,65,67,65,74,\
  66,66,73,65,69,69,71,69,61,71,2e,73,64,77,2e,2e,2e,2e,2e,2e,2e,2e,73,61,74,\
  74,65,72,6f,7a,64,74,65,6e,73,68,65,2e,64,73,6f,6f,6f,65,75,73,62,2e,2e,2e,\
  2e,2e,62,79,6d,61,6b,61,69,69,65,67,65,74,2e,64,73,6f,6f,6f,65,75,73,62,2e,\
  2e,2e,2e,2e,62,79,6d,61,6b,61,69,69,65,67,65,74,63,68 
Da in der REG-Datei Zeilenumbrüche und das Gleichheitszeichen vorhanden sind, die ich nicht schaffe herauszufiltern, um dann alles auf einer Zeile zusammenzustellen, schaffe ich auch kein Vergleich der beiden Zeichenfolgen. Wie sollen die beiden Werte verglichen werden?

Gruß
evinben
pieh-ejdsch
pieh-ejdsch 27.02.2012 um 13:33:33 Uhr
Goto Top
moin,

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
icsat
icsat 27.02.2012 um 13:43:54 Uhr
Goto Top
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
evinben
evinben 27.02.2012 um 14:31:05 Uhr
Goto Top
Hallo 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.
Ich brauche noch mal deine Hilfe, damit ich den Code richtig anwenden kann:
Beim Ausführen der Batch schließt sich das Fenster sofort und ich kann den Fehler nicht nachvollziehen, egal wo ich dann die Pause setze (auch zw. der 9. und 10. Zeile).
Könnte eventuell ein Fehler irgendwo vorliegen? Soll ich im Anschluss die zu bearbeitende .txt-Datei per Drag&Dropp auf deine Batch rüberschieben oder doch diese eigenständig ausführen?
Was mich sehr interessieren würde ist vor allem die Bedeutung von %%? und %%@ (ich kannte bisher nur Buchstaben) und auch von [%%\ und %%].
Es würde mich echt freuen, wenn du mir es erklären könntest, wie dieser Aufbau funktioniert, damit ich es wirklich von der Logik her aufnehmen kann (z. B. "%~dpn1 ist soweit klar, aber was das > davor bewirkt kann ich nicht nachvollziehen. >nul weiß ich aber für <nul nicht mehr und insgesamt den ganzen Ablauf sehe ich noch sehr abstrakt).

Vielen Dank!

Gruß
evinben
icsat
icsat 27.02.2012 um 14:36:56 Uhr
Goto Top
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:
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]
Skyemugen
Skyemugen 27.02.2012, aktualisiert am 18.10.2012 um 18:50:08 Uhr
Goto Top
Aloha,

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 face-wink

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 geil

greetz André
icsat
icsat 27.02.2012 um 15:40:03 Uhr
Goto Top
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:
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 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
evinben
evinben 27.02.2012 um 15:41:57 Uhr
Goto Top
wow, wow, wow!

Skyemugen, dir ebenso ein großes Lob für die Erklärung! Ich habe mir die Anleitung aus dem Link hungrig durchgelesen - wirklich sehr gut beschrieben!!!
Bleibt nur das alles schön zu verdauen und paar Beispiele selbst realisieren. Zumindest weiß ich nun, dass die Ausgabe ohne Zeilenumbrüche zu schaffen wäre. Vielleicht gelingt es mir, sodass es dann der direktere/einfachere Weg wäre die txt-Datei gleich im ersten Schritt ohne Zeilenumbrüche zu erzeugen, als diese in einem separaten Schritt umzuwandeln.
Ich muss dringend etwas erledigen und dann gehets wieder weiter, bis ich es endlich geschafft habe.


back-to-topIHR SEID SPITZE!!!


Gruß
evinben
bastla
bastla 27.02.2012 um 16:02:43 Uhr
Goto Top
@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 face-wink):
 >"%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 ... face-wink

Grüße
bastla
pieh-ejdsch
pieh-ejdsch 27.02.2012 um 16:20:27 Uhr
Goto Top
hallo evinben,

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:^"=!" 
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
"DosDevices:"
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
Skyemugen
Skyemugen 27.02.2012 um 17:20:35 Uhr
Goto Top
Aloha Phil warum schreiben T-Mo und du eigentlich immer das é falsch,

Eingabeumleitung, hmm, in meinen Tests hat es auch dafür gesorgt, dass der darauffolgende Befehl in dieselbe Zeile kam, daher ging ich davon aus, dass ... heute Montag ist ^__^

greetz André
bastla
bastla 27.02.2012, aktualisiert am 18.10.2012 um 18:50:09 Uhr
Goto Top
[OT]
@ph
Kleine Korrektur face-wink: Vorhandensein einer Internetverbindung per Batch pruefen, ...

Grüße
bastla
[/OT]
icsat
icsat 27.02.2012 um 22:00:42 Uhr
Goto Top
Nabend bastla,

Zitat von @bastla:
Aber es gibt ja (wie auch dieser Thread wieder zeigt) genug Wege, und manche führen sogar nach Rom ... face-wink
Dein Wort in Gottes Gehörgang und hoffentlich führen die aufgezeigten Wege wirklich nach Rom und nicht etwa nach Athen oder so face-wink


Gruß icsAT
icsat
icsat 27.02.2012 um 22:04:13 Uhr
Goto Top
Hallo Phil,

danke für den Hinweis. Habe das aus dem Ursprungspost übernommen, war mir aber nicht bewusst, dass es so nicht funktionieren würde. Passe das im Skript mal an.


Gruß icsAT
icsat
icsat 27.02.2012 um 22:11:48 Uhr
Goto Top
[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 face-wink


Gruß icsAT
[/OT]

[EDIT]Dem Biber das erste e geklaut.[/EDIT]
bastla
bastla 27.02.2012 um 23:01:10 Uhr
Goto Top
[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 ... face-wink

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
icsat 28.02.2012 um 00:45:45 Uhr
Goto Top
[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 ... face-wink

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 face-wink)
  • 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]
evinben
evinben 28.02.2012 um 09:41:34 Uhr
Goto Top
Hey ihr, bastla und icsat, schön dass ihr aus Motag einen Schöntag macht ;). Ohne ein bisschen Humor ist der Tag ansonsten trocken.

Hallo Phil,

ich habe es geschafft! …auch hab zum größten Teil deinen Code verstanden. Paar Fragen brennen bei mir noch:
1. Wie kommst du drauf den Befehl setlocal enabledelayedexpansion innerhalb desselben Batches erneut hinzuzufügen? Kann es sein, da wir mit :eof den vorherigen Abschnitt (mit dem ersten Befehl setlocal enabledelayedexpansion) beenden? Oder warum genau, wegen dem <NUL, da er den Stapel rückwärts verarbeitet? Ohne die zweite Zeile funktioniert es tatsächlich nicht face-wink
2. Warum eigentlich ist die "Line=" am Ende, wenn es auch ohne sie funktioniert?
3. Lässt sich innerhalb des Batches das Ergebnis an eine Variable übergeben, oder funktioniert dieser Trick mit <NUL nur wenn der Bildschirminhalt in eine Datei ausgegeben wird.
4. Die Anführungszeichen in der Filter-Variable Zeichen= lassen sich nicht verarbeiten. Mehrere Variationen habe ich bereits ausprobiert (mit ^ escapen, zusätzlichen Anführungszeichen und so weiter …). Wenn du dafür keine Lösung hättest, werde ich es einfach über eine zweite Variable %var:^“=% herausfiltern.

Das alles sind dennoch Kleinigkeiten dieses großen Erfolges.

Ich bin einfach begeistert.

Gruß
evinben

(Erst nachdem ich es auf chcp 1252 umgestellt habe, ging es bei mir.)
pieh-ejdsch
pieh-ejdsch 28.02.2012 um 15:24:29 Uhr
Goto Top
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]
Aloha Phil warum schreiben T-Mo und du eigentlich immer das é falsch,
Vielleicht sind wir die einzigen, welche deinen Namen ausschreiben. Etwas zur Verwirrung face-devilish (extra für Biber aufgelesen) 0face-smile.
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.
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:
Set /P "=Text der angezeigt wird, bevor der Wert in die Variable aufgenommen wird. "  
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.
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
icsat
icsat 28.02.2012 um 16:12:20 Uhr
Goto Top
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
if not defined Line goto :eof
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 face-wink 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 face-wink


Gruß icsAT

[EDIT]Oh, Phil war schneller, blödes Multitasking.[/EDIT]
Skyemugen
Skyemugen 28.02.2012 um 16:56:02 Uhr
Goto Top
Zitat von @icsat:
[EDIT]Oh, Phil war schneller, blödes Multitasking.[/EDIT]

Ach, die ~50 Minuten, die Phil eher gepostet hat face-wink Dabei sein ist alles ^__^

Immerhin hast du bei 4. mal etwas dazugelernt face-wink
evinben
evinben 28.02.2012 um 17:41:02 Uhr
Goto Top
Hallo Phil,

oh-h-h man ;), oben steht es tatsächlich DISABLEdelayedexpansion ! Das kommt daher, da ich in meiner bisheringen kurzen Praxis in der Kopfzeile nur enable… benutzt und mir diesmal aus Gewohnheit eingebildet habe in deinem Code stände es oben genauso . Sorry für die verwirrende Frage dann.

Einen passenden CMD-Line-One-Liner speziell für Reg: (diser ist aber Grotten-langsam)
Leider funktioniert diese Befehlszeile bei mir nicht. Muss ich noch etwas, außer dem Pfad der Datei natürlich, anpassen bzw. etwas in der vorherigen Zeile setzen? Ich kriege sie definitiv nicht zum Laufen. CHCP 1252 habe ich davor gesetzt, tut sich aber trotzdem nichts.

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.
Hmm… der Trick mit der Eingabe-Simulation, den ich schon längst vermisst habe, glaube ich schon oben verstanden zu haben. Auch den Beitrag von Ren dazu habe ich mir schon durchgelesen.
Was ich allerdings noch nicht verstehe ist: es wird darauf hingewiesen, dass vor dem Gleichheitszeichen nichts stehen soll, also folgendermaßen:
set /p =“Alles rein!“
An was genau wird dann der Informationsfluss übergeben? Womit kann ich es nun z. B. auf einer neuen Zeile in ECHO wiedergeben?
Wenn es etwa wie fologt sein dürfte
set /p Ich-Bin-Froh-Dass-Ich-Eine-Variable-Habe=Alles rein!
würde es mir einleuchten und udn könnten den Zeichensatz weiterverarbeiten, z. B. auf einer neuen Zeile anzeigen
echo % Ich-Bin-Froh-Dass-Ich-Eine-Variable-Habe %
Oder funktioniert die Umleitung nur in eine Datei, als etwa nur wie folgt?
<nul set /p =Alles rein!
Ich habe deine Anleitung HowTo For Schleife mit TokenTrenner AnführungsZeichen irgendwann mal schon gelesen gehab und jetzt habe ich mir diese noch einmal durchgelesen. Huhh.. es ist mir noch zu hoch. Ich würde sagen Stück für Stück, Schritt für Schritt und habe die Hoffnung, dass es bald besser wird. Alles auf ein Mal ist echt zu hart.
Danke noch mal.


Hallo icsAT,

danke sehr! Je mehr Infos, desto logischer wird es mir.

Gruß
evinben
Biber
Biber 28.02.2012 um 19:44:08 Uhr
Goto Top
[/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 face-wink

[/Bonus-OT zur Richtigstellung]
pieh-ejdsch
pieh-ejdsch 28.02.2012 um 20:08:51 Uhr
Goto Top
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.
>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
Hier schon zu erkennen dass die Datei "test" im Ansi Format vorliegt, ist auch nur die halbe größe von der "Datei.reg"

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
icsat
icsat 28.02.2012 um 21:01:09 Uhr
Goto Top
Hallo evinben,

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
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:
>"%~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"  
lauten, ansonsten würde ich denken, dass der läuft.

Gruß icsAT
evinben
evinben 28.02.2012 um 22:23:52 Uhr
Goto Top
Hallo Phil,

danke für deinen Tipp. Dein CMD-Line-One-Liner funktioniert nun auch bei mir mit Hilfe von @icsat ;) - sogar sowohl mit ANSI als auch mit UNICODE (falls eine über den Windows Registrierungseditor exportierte reg-Datei wie du schreibst tatsächlich so eine wäre).
Das ist eine extrem vereinfachte Variante, im Vergleich zu diejenige, mit der ich alle hier angesteckt habe. Andererseits lernt man auf der Weise so viel und ich hoffe anderen Einsteiger werden diese Lektüre hier ebenso sehr hilfsreich sein.


Hallo icsAT

vielen herzlichen Dank für deine Mühen die Anleitung so gut verständlich zu gestallten.
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:
Du hast recht ich habe die Variablen tatsächlich nicht angepasst gehabt.
Der Fachjargon CMD-Line-One-Liner war mir völlig neu und bin davon ausgegangen, dass es die Formulierung auf einer einzigen Zeile beschreibt. Nachdem ich dann angefangen habe den Code auf irgendwelche Unstimmigkeiten zu prüfen, bin ich auf alles Restliche so fixiert gewesen dabei aber nicht registriert gehabt, dass es sich überall um jeweils alleinstehendes % Zeichen handelt – nämlich für die CMD-Eingaben. Na ja, Routine ist etwas anders face-sad, ich habe sie noch nicht.

Ich habe mir die Hilfe für SET und FOR mehrmals durchgelesen. Das war eigentlich das meiste in der letzten Zeit, was ich im CMD je gelesen habe. Ohne eure Hilfe hier wäre ich nie alleine drauf gekommen solche ausgefallene Tricks einzuwenden.

Ich schaffe leider nicht in dem Code von @phil (in seinem erste vom 27.02.2012, 13:33) eine Variable zu setzen, anstatt der Ausgabe in Datei
<code
"%~dpn1-Neu%~x1" (

Es macht dem Batch natürlich nichts, ich möchte es dennoch wissen, wie es von euch gemeint ist. Ich weiß einfach nicht wo genau ich ein SET var= setzen muss.


@phil
Einen passenden CMD-Line-One-Liner speziell für Reg: (dieser ist aber Grotten-langsam)
Ja, die Befehlszeile funktioniert nun und ich kann darüber jetzt lachen, wie es noch simpler und komprimierte geht, als mit meiner dicken aufgeblähten Batch-Datei, die ich hier verursacht habe.
Aber ich habe mit eurer Hilfe sehr viel dabei gelernt und kann jetzt ruhig schlafen.

back-to-topDer Beitrag gilt nun mehr als erfolgreich gelöst

Eine gute Nacht
evinben
evinben 29.02.2012 um 00:42:34 Uhr
Goto Top
Wenn jemand sich den Kaffee über Batch kochen möchte, dann ist es eine Frage von 10…15,- €: ein etwa 2,- € Optokoppler, dessen Steuereingang für etwa 2V - 5V Spannungspegel ausgelegt ist, ein etwa 10,- € 2000 Watt kleiner Halbleiterrelais (SSR = solid state relay, das absolut lautlos ist) und ein bisschen Kabel von ihm zu einer Schucko-Steckdose. Der Steuereingang des Optokopplers soll Der Ein- und Ausgang bei beiden Halbleier sind galvanisch getrennt, und den Computer von Überspannungen und EMV schützt. Ein kleiner Optokoppler braucht eine geringe Stromstärke um eingeschaltet zu werden. Daher kann sowohl ein Desktop-Computer, der mit 5V Logikpegel arbeitet, als auch ein Notebook, der mit 3V Logikpegel arbeitet, diesen sicher ein- und ausschalten, ohne vom PC-Netzteil extra ein Kabel ziehen zu müssen. Die Spannung und die Stromstärke sind soweit ausreichend. Wem es nicht stört, kann sich die Spannung von dem PC-Netzteil hohlen und erspart sich die 2,- € für den Optokoppler.
Nun die Steuerleitung des Optokopplers oder nur des Relais (falls er vom PC-Netzteil eingespeist wird) mit dem richtigen Pin der Parallelen Schnittstelle (den LPT-Port) und den anderen - seine Masse – mit dem Grund (der Masse) des Computers verbinden.
Wenn die Kaffemaschine vorbereitet ist, dann die Batch starten und den richtigen Print-Befehl oder sonstigen herausfinden. Dabei muss man nur darauf achten, dass das Ausgangssignal an dem Pin zur unseren Aufgabe nicht reversiert ist (ein HIGH Signal schaltet das Relais ein und ein LOW aus): das Relais soll sich ja einschalten, wenn unser Print- und sonstiger Befehl die Aufgabe „Kochen“ hat und nicht andersrum. Entsprechend einfach einen anderen Pin aussuche, bei dem HIGH und LOW verkehrt rum sind oder sich den reversiven Befehl (mit umgekehrten Bedeutung) dann gut merken!
Und jetzt an das logische Denken - die richtige Verdrahtungt:

back-to-topParallel - Port ( LPT )


Logik: +5 V = high, 0 V = low (TTL-Pegel)
"-" vor der Bezeichnung: Signal ist low-aktiv.

Rechner Drucker Bedeutung Ein-/Ausganges (aus Sicht des PC
1 1 -Strobe (Daten übernehmen) aus
2 2 D0 (Datenbit 0) aus
3 3 D1 .
4 4 D2 .
5 5 D3 .
6 6 D4 .
7 7 D5
8 8 D6
9 9 D7 (Datenbit 7) aus
10 10 -Acknowledge (Verstanden) ein
11 11 Busy (Besetzt) ein
12 12 PE (kein Papier) ein
13 13 Select (Drucker online) ein
14 14 -autofed aus
15 32 -Error (Drucker Fehler) ein
16 31 -Init (Drucker zurücksetzen) aus -Init (Drucker zurücksetzen) aus
17 36 -Select -Select
18 19 19 19
. . Signalmasse, alle verbunden Signalmasse, alle verbunden
. . (auch im Druckerkabel) (auch im Druckerkabel)
25 30 30 30
- 16 GND* GND*
- 17 GND* GND*
- 18 +5 Volt* +5 Volt*
- 33 GND* GND*
- 34 n.c.* n.c.*
- 35 +5 Volt* +5 Volt*


*) eventuel nicht bei allen Druckern

Den Kaffeautomat müsstet ihr vorher - jeweils am Abend - fleißig vorbereiten, um am nächsten Tag an den frühmorgigen Genuss des Befehles und an eine Portion frischer Kaffe kommen zu können: „Wer sät, der erntet“. Alleine mit Batch "alles" ist nie zu ersetzten, ansonsten wäre es genau so, wie ein Perpetuum-Mobile-Absurd. Derjenige, der eine automatische Nachfüllung und Reinigung sich gerne wünscht, kann einen höheren Aufwand leisten.
Ihr könntet sogar den Kaffe-Kocher mit diesem vereinfachten Aufbau, auf beliebige Temperatur ansteuern - ein einfaches Gerät sollte es dann sein. Das Verfahren heißt fachlich PWM (Pulsweitenmodulation). Da alle SSR hochfrequent tackten können, können wir mit variablen Ein- und Ausschaltzyklen arbeiten. Den Print-Befehl zum Erzeugen regelmäßiger Ein-und Ausschaltvorgängen mit variabler Frequenz müsstet ihr dann herausfinden. Anschließend beim Aufruf des Batches habt ihr die folgende Möglichkeit zur Wahl:


- Kochvorgang jetzt starten
- Kochvorgang in 30 Min. starten
- Auf 60° Temperatur warm halten
- Auf 70° Temperatur warm halten
- Auf 80° Temperatur warm halten
- Kochvorgang um 7:00 starten
- Kochvorgang um 13:00 starten


Gruß
evinben


PS: Nicht vergessen den 2000W Halbleiter-Relais, das das 230V Netz-Kabel, ein- und ausschaltet, in einem Gehäuse zu verbauen. Ihr wisst natürlich, dass die kleine Kinder überall da zum Spielen hingehen, wo wir es nicht ahnen.
60730
60730 29.02.2012 um 21:20:50 Uhr
Goto Top
moin Mäddelzzz...

Zitat von @pieh-ejdsch:
Wenn du tatsächlich Reg-Dateien benutzt, sind diese im Unicode Format
  • Außer man(n) kennt den /ascii Parameter von regedit.... face-wink
> regedit /a mounted.devices.reg HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
> find "\" mounted.devices.reg

---------- MOUNTED.DEVICES.REG
[HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices]

Gruß