matsahm
Goto Top

DOS Text-Dateien unter Windows anzeigen

Hallo Admins,

Ich versuche verzweifelt eine in der Kommandozeile erstellte Textdatei unter Windows 7 korrekt anzuzeigen. Ich komme aber nicht weiter.

Eingabe an der Kommandozeile:
ipconfig /all | find "ü" > c:\test.txt
start c:\test.txt

Daraufhin startet Notepad mit folgender Ausgabe:
NetBIOS ber TCP/IP . . . . . . . : Aktiviert
NetBIOS ber TCP/IP . . . . . . . : Aktiviert
(Das ü fehlt)

Ich weiß, das ich mit Wordpad die Datei korrekt öffnen kann, wenn ich als Format MS-DOS auswähle. Das kann ich in meinem Fall aber nicht nutzen, da ich das Programm aus der Batch heraus starten möchte. Wenn ich Wordpad die Textdatei als Parameter mitgebe, wird sie ebenso wie in Notepad falsch angezeigt.

Mögliche Lösungen, welche ich aber alle nicht realisiert bekomme:
1. Wordpad mit Parameter starten, dass die Datei im MS-DOS Format geladen wird. Dazu konnte ich nichts finden.
2. Die Textdatei an der Kommandozeile auf Umlaute untersuchen und durch ae oe und ue ersetzen.
3. Die Textdatei (ASCII) in das ANSI-Format konvertieren. Hier habe ich nur den umgekehrten Weg gefunden (mit TYPE).

Wichtig ist, dass es mit Windows Bordmitteln (XP, Vista, 7) funktioniert. Bevorzugt direkt in der Batch. Notfalls mit eingebetteter vbs-Datei. Hat jemand Ideen dazu?

Gruß
Mathias

Content-Key: 165071

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

Printed on: May 5, 2024 at 01:05 o'clock

Mitglied: 99045
99045 Apr 22, 2011 at 10:43:51 (UTC)
Goto Top
gelöscht, war ein Versehen.
Member: TsukiSan
TsukiSan Apr 22, 2011 at 14:17:30 (UTC)
Goto Top
eventuell liegt's an der Keyboardeinstellung CHCP

Gruss
Tsuki
Member: matsahm
matsahm Apr 22, 2011 at 14:22:37 (UTC)
Goto Top
Damit habe ich schon gespielt, aber die Ausgabe hat sich nicht verändert face-sad

Gruß
Mathias
Member: TsukiSan
TsukiSan Apr 22, 2011 at 14:40:43 (UTC)
Goto Top
Naja, mit VBSimplementierung könnte es in etwa so aussehen:
@Echo OFF
>"C:\MeinIPCONFIG.vbs" Echo Set objShell = CreateObject("WScript.Shell")  
>>"C:\MeinIPCONFIG.vbs" Echo Set objWshScriptExec = objShell.Exec("ipconfig /all")  
>>"C:\MeinIPCONFIG.vbs" Echo Set objStdOut = objWshScriptExec.StdOut  
>>"C:\MeinIPCONFIG.vbs" Echo strOutput = objStdOut.ReadAll  
>>"C:\MeinIPCONFIG.vbs" Echo Set FSO = CreateObject("Scripting.FileSystemObject")  
>>"C:\MeinIPCONFIG.vbs" Echo Set MeineDatei = FSO.CreateTextFile("C:\Test.txt",True).Write(strOutput)  
>>"C:\MeinIPCONFIG.vbs" Echo MeineDatei.Close  
>>"C:\MeinIPCONFIG.vbs" Echo Set FSO = Nothing  

Call "C:\MeinIPCONFIG.vbs"  

REM hier käme deine FOR-Schleife mit FINDSTR "Ü"  
REM aber da wären wir ja wieder beim Problem, oder?

del C:\MeinIPCONFIG.vbs /q
aber ob somit das Ü-Problem gelöst werden kann???

Gruss
Tsuki
Member: rubberman
rubberman Apr 22, 2011 at 21:46:49 (UTC)
Goto Top
Hallo matsahm.

Zitat von @matsahm:
Damit habe ich schon gespielt, aber die Ausgabe hat sich nicht verändert face-sad

Dann hast du noch nicht genug gespielt. Natürlich liegt des Rätsels Lösung in der Zeichenkodierung. Folgendes funktioniert (wenn auch langsam).
@echo off &setlocal
>C:\test.txt type nul
for /f "delims=" %%a in ('ipconfig /all') do (  
  set "line=%%a"  
  call :proc
)
goto :eof

:proc
setlocal enabledelayedexpansion
chcp 1252>nul
>>C:\test.txt (echo(!line!|find "ü")  
endlocal
goto :eof

Der Code ist im ANSI Format gespeichert (was die meisten Texteditoren by default tun) und erzeugt bei mir folgenden Dateiinhalt:
   NetBIOS über TCP/IP . . . . . . . : Deaktiviert
   NetBIOS über TCP/IP . . . . . . . : Deaktiviert


Grüße
rubberman
Member: matsahm
matsahm Apr 23, 2011 at 06:43:12 (UTC)
Goto Top
Hallo Rubberman,

Vielen dank, das Funktioniert. Ich brauche aber die ganze Ausgabe von ipconfig. Das | find "ü" war hier nur für die schnelle Demonstration. Wenn ich das aus deinem Skript entferne, werden aber alle Leerzeilen entfernt. Das macht die Text-Datei wieder sehr unübersichtlich. Gibt es dafür auch eine Lösung? Ich habe es mitlerweile auch geschafft alle Umlaute zu ersetzen. Dabei tritt aber genau das gleiche Problem auf. Leere Zeilen werden verschluckt.

Gruß
Mathias
Member: rubberman
rubberman Apr 23, 2011 at 10:41:25 (UTC)
Goto Top
Hallo matsahm,

dazu kannst du den alten Trick mit findstr /n "^" nutzen. Hierbei werden alle Zeilen (incl. Leerzeilen) durchnummeriert. Die Zeilennummer wird anschließend über den Doppelpunkt als Delimiter abgeschnitten ...
@echo off &setlocal
>C:\test.txt type nul
for /f "tokens=1* delims=:" %%a in ('ipconfig /all^|findstr /n "^"') do (  
  set "line=%%b"  
  call :proc
)
goto :eof

:proc
setlocal enabledelayedexpansion
chcp 1252>nul
>>C:\test.txt echo(!line!
endlocal
goto :eof

Grüße
rubberman
Member: matsahm
matsahm Apr 23, 2011 at 12:09:20 (UTC)
Goto Top
Hallo rubberman,

Vielen Dank, das wars. Genau das habe ich gesucht. Eine Frage zum Verständnis der Batch: Was bedeutet die Klammer bei echo(!line!

Gruß
Mathias
Member: rubberman
rubberman Apr 23, 2011 at 21:04:42 (UTC)
Goto Top
Hallo matsahm,

die Klammer sieht etwas befremdlich aus, ist aber letztlich eines der möglichen Zeichen die erforderlich sind, um auch Leerzeilen auszugeben. Verbreiteter ist natürlich das
echo.
Warum ich statt dessen meistens
echo(
verwende, kannst du ECHO. (Zeilenvorschub) funktioniert nicht nachlesen.

Das EnableDelayedExpansion nutze ich, um eventuelle Sonderzeichen ohne Maskierung ausgeben zu können (auch wenn das in diesem Fall vermutlich nicht nötig ist).

Grüße
rubberman