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

Alle Zeilenumbrüche in einer Textdatei entfernen. Gleichheitszeichen auch.

Frage Entwicklung Batch & Shell

Mitglied: evinben

evinben (Level 2) - Jetzt verbinden

27.02.2012, aktualisiert 18.10.2012, 10095 Aufrufe, 32 Kommentare

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!
01.
if exist "tmp2.txt" (del "tmp2.txt") 
02.
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
32 Antworten
Mitglied: Skyemugen
27.02.2012 um 08:36 Uhr
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:
01.
set /a "Wert=0" 
02.
for /f "usebackq delims=" %%s in ("E:\Skripte\datei.txt") do ( 
03.
	set /a "Wert+=1" 
04.
	set "Var!Wert!=%%s" 
05.
06.
echo !Var1! !Var2! !Var3! !Var4! 
07.
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é
Bitte warten ..
Mitglied: evinben
27.02.2012 um 09:53 Uhr
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
Bitte warten ..
Mitglied: icsat
27.02.2012 um 11:15 Uhr
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:
01.
setlocal 
02.
 
03.
set "vbs=D:\temp\~replace.vbs" 
04.
set "eingabe=D:\temp\eingabe.txt" 
05.
set "ersetzt=D:\temp\~ersetzt.txt" 
06.
set "ausgabe=D:\temp\ausgabe.txt" 
07.
 
08.
if exist %ausgabe% del %ausgabe% 
09.
 
10.
echo Set fso=CreateObject("Scripting.FileSystemObject"):txt=fso.OpenTextFile("%eingabe%").ReadAll:fso.OpenTextFile("%ersetzt%",2,True).Write Replace(txt,"=","")>"%vbs%" 
11.
cscript //nologo "%vbs%" 
12.
 
13.
for /f "usebackq delims=" %%a in ("%ersetzt%") do set /p=%%a<nul>>%ausgabe% 
14.
 
15.
if exist %ersetzt% del %ersetzt% 
16.
if exist %vbs% del %vbs% 
17.
 
18.
endlocal 
19.
goto :eof

Gruß icsAT


[EDIT]Löschen korrigiert und löschen der Ausgabe ergänzt. [/EDIT]
Bitte warten ..
Mitglied: bastla
27.02.2012 um 12:21 Uhr
@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
Bitte warten ..
Mitglied: evinben
27.02.2012 um 13:32 Uhr
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
01.
 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:
01.
 [HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices] 
02.
"\\Beispiel\\U:"=hex:5f,00,3f,00,3f,00,5f,00,55,00,53,00,42,00,53,00,54,00,4f,\ 
03.
  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,\ 
04.
  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,\ 
05.
  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,\ 
06.
  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,\ 
07.
  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,\ 
08.
  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,\ 
09.
  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,\ 
10.
  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,\ 
11.
  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,\ 
12.
  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,\ 
13.
  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,\ 
14.
  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,\ 
15.
  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,\ 
16.
  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,\ 
17.
  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,\ 
18.
  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,\ 
19.
  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
Bitte warten ..
Mitglied: pieh-ejdsch
27.02.2012 um 13:33 Uhr
moin,

sollte bzw. geht auch ohne vbs

01.
@echo off &setlocal disabledelayedexpansion 
02.
Prompt $g 
03.
::echo on 
04.
set "Zeichen=.,\=" 
05.
 rem als ersten Parameter erwartet der Batch eine Datei 
06.
if not exist "%~1" rd & exit /b 1 
07.
 rem die Ausgabe erfolgt in die Datei mit extrakürzel -Neu 
08.
>"%~dpn1-Neu%~x1" (for /f "usebackqdelims=" %%i in (%1) do (set "Line=%%i" 
09.
	call :Write 
10.
)) 
11.
goto :eof 
12.
:Write 
13.
if not defined Line goto :eof 
14.
setlocal enabledelayedexpansion 
15.
16.
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%%[%%\" 
17.
	set "Line=%%]" 
18.
19.
)||endlocal&&set "Line=" 
20.
goto :Write
Gruß Phil
Bitte warten ..
Mitglied: icsat
27.02.2012 um 13:43 Uhr
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
Bitte warten ..
Mitglied: evinben
27.02.2012 um 14:31 Uhr
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
Bitte warten ..
Mitglied: icsat
27.02.2012 um 14:36 Uhr
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:
01.
setlocal enabledelayedexpansion 
02.
 
03.
set "vbs=D:\temp\~replace.vbs" 
04.
set "eingabe=D:\temp\eingabe.txt" 
05.
set "ersetzt=D:\temp\~ersetzt.txt" 
06.
set "ausgabe=D:\temp\ausgabe.txt" 
07.
 
08.
if exist %ausgabe% del %ausgabe% 
09.
 
10.
echo Set fso=CreateObject("Scripting.FileSystemObject"):txt=fso.OpenTextFile("%eingabe%").ReadAll:fso.OpenTextFile("%ersetzt%",2,True).Write Replace(txt,"=","")>"%vbs%" 
11.
cscript //nologo "%vbs%" 
12.
 
13.
for /f "usebackq delims=" %%a in ("%ersetzt%") do ( 
14.
	set "line=%%a" 
15.
	set "line=!line:,\=!" 
16.
	set "line=!line:,=!" 
17.
	set line=!line:"DosDevicesJ:"=! 
18.
	set "line=!line:hex:=!" 
19.
	set "line=!line: =!" 
20.
	set /p="!line!"<nul>>%ausgabe% 
21.
pause 
22.
23.
 
24.
if exist %ersetzt% del %ersetzt% 
25.
if exist %vbs% del %vbs% 
26.
 
27.
endlocal 
28.
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]
Bitte warten ..
Mitglied: Skyemugen
27.02.2012, aktualisiert 18.10.2012
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

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 Scheiße, die der Phil da wieder bastelt :D einfach nur geil

greetz André
Bitte warten ..
Mitglied: icsat
27.02.2012 um 15:40 Uhr
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
Bitte warten ..
Mitglied: evinben
27.02.2012 um 15:41 Uhr
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.


IHR SEID SPITZE!!!


Gruß
evinben
Bitte warten ..
Mitglied: bastla
27.02.2012 um 16:02 Uhr
@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 ):
01.
 >"%vbs%" echo ToRemove=", =\"^&vbCrLf:Set fso=CreateObject("Scripting.FileSystemObject"):txt=fso.OpenTextFile("%eingabe%").ReadAll 
02.
>>"%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
Bitte warten ..
Mitglied: pieh-ejdsch
27.02.2012 um 16:20 Uhr
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
Bitte warten ..
Mitglied: Skyemugen
27.02.2012 um 17:20 Uhr
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é
Bitte warten ..
Mitglied: icsat
27.02.2012 um 22:00 Uhr
Nabend bastla,

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


Gruß icsAT
Bitte warten ..
Mitglied: icsat
27.02.2012 um 22:04 Uhr
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
Bitte warten ..
Mitglied: icsat
27.02.2012 um 22:11 Uhr
[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]
Bitte warten ..
Mitglied: bastla
27.02.2012 um 23:01 Uhr
[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]
Bitte warten ..
Mitglied: icsat
28.02.2012 um 00:45 Uhr
[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).

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]
Bitte warten ..
Mitglied: evinben
28.02.2012 um 09:41 Uhr
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
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.)
Bitte warten ..
Mitglied: pieh-ejdsch
28.02.2012 um 15:24 Uhr
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 (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.
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:
01.
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:
01.
,= \
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)
01.
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
Bitte warten ..
Mitglied: icsat
28.02.2012 um 16:12 Uhr
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
01.
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 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]
Bitte warten ..
Mitglied: Skyemugen
28.02.2012 um 16:56 Uhr
Zitat von 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
Bitte warten ..
Mitglied: evinben
28.02.2012 um 17:41 Uhr
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:
01.
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
01.
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
01.
echo % Ich-Bin-Froh-Dass-Ich-Eine-Variable-Habe %
Oder funktioniert die Umleitung nur in eine Datei, als etwa nur wie folgt?
01.
<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
Bitte warten ..
Mitglied: Biber
28.02.2012 um 19:44 Uhr
[/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]
Bitte warten ..
Mitglied: pieh-ejdsch
28.02.2012 um 20:08 Uhr
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
Bitte warten ..
Mitglied: icsat
28.02.2012 um 21:01 Uhr
Hallo evinben,

neben dem von Phil empfohlenem lesen der Hilfe hilft das ausprobieren diverser Varianten mir teilweise zum Verständnis:
01.
@echo off 
02.
set /p ="1 ohne Variable, eine Eingabe wird erwartet: " 
03.
echo Deine Eingabe kann nicht weiter verwendet werden. 
04.
echo. 
05.
set /p var2="2 mit Variable, eine Eingabe wird erwartet: " 
06.
echo Deine Eingabe "%var2%" kann weiter verwendet werden 
07.
echo. 
08.
<nul set /p ="3 ohne Variable, eine Eingabe wird nicht erwartet, da diese automatisch erfolgt: " 
09.
echo. 
10.
echo Es wird keine Variable gesetzt, daher kann keine Verwendet werden. 
11.
echo. 
12.
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 
13.
echo. 
14.
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%) 
15.
echo. 
16.
echo Beispiel 3 und 4 machen eigentlich keinen Sinn, da wir die Ausgaben ja genau so gut mit Echo erhalten haetten. 
17.
echo. 
18.
echo Wir machen es uns allerdings zu Nutzen, dass der Unterschied zum echo der Fehlende Zeilenumbruch ist. 
19.
echo Ohne meine Zwischenechos haette das Ergebnis für 3+4 naemlich etwas anders ausgesehen: 
20.
echo. 
21.
<nul set /p ="3 ohne Variable, eine Eingabe wird nicht erwartet, da diese automatisch erfolgt: " 
22.
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 
23.
echo. 
24.
echo. 
25.
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. 
26.
echo. 
27.
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:
01.
>"%~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:
01.
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
Bitte warten ..
Mitglied: evinben
28.02.2012 um 22:23 Uhr
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 , 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
01.
"%~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.

Der Beitrag gilt nun mehr als erfolgreich gelöst

Eine gute Nacht
Bitte warten ..
Mitglied: evinben
29.02.2012 um 00:42 Uhr
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:

Parallel - 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
17 36 -Select
18 19
. . Signalmasse, alle verbunden
. . (auch im Druckerkabel)
25 30
- 16 GND*
- 17 GND*
- 18 +5 Volt*
- 33 GND*
- 34 n.c.*
- 35 +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.
Bitte warten ..
Mitglied: 60730
29.02.2012 um 21:20 Uhr
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....
> regedit /a mounted.devices.reg HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices 
> find "\" mounted.devices.reg 
 
---------- MOUNTED.DEVICES.REG 
[HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices]
Gruß
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst Appx aus Image auslesen und entfernen (9)

Frage von Markus2016 zum Thema Batch & Shell ...

CPU, RAM, Mainboards
CPU Lüfter von CPU entfernen (6)

Frage von uridium69 zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...