knechtibus
Goto Top

Per Batch beliebiges Dateiformat mit Editor öffnen und als .txt abspeichern

Hallo miteinander,

ich möchte gern eine Datei mittels Batch mit dem Editor öffnen und dann als .txt abspeichern. Ich geb mal ein kleines Beispiel:

Dat1.rf7 soll mit "in" den Editor geöffnet werden und anschließend als Dat1.txt abgespeichert werden.

Ich habe schon versucht nur die Dateiformat-Endung zu ändern (einfach von .rf7 zu .txt), was allerdings die Datei scheinbar nicht soweit verändert, als das man anschließend die Resultierende .txt zu 100% weiterverarbeiten kann. Wenn man die Datei manuell mit dem Editor öffnet und abspeichert macht das Weiterverarbeiten keine Probleme. Deswegen der eventuell umständlich erscheinende Weg mit dem Editor.
Freue mich auf eure Antworten.

MfG
knechtibus

Content-Key: 122034

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

Printed on: April 19, 2024 at 21:04 o'clock

Member: SchoSeb
SchoSeb Aug 05, 2009 at 08:24:38 (UTC)
Goto Top
Hi,

auf Konsole:

type Dat1.rt7 > Dat1.txt

funktioniert nicht?

Gruß Sebastian
Member: knechtibus
knechtibus Aug 05, 2009 at 08:33:36 (UTC)
Goto Top
Hallo SuperMariO,

das hatte ich auch gleich als erstes versucht. Das Problem ist einfach, dass der Editor beim Öffnen und anschließenden Speichern die Datei schinbar ein wenig verändert. Genau diese Veränderung benötige ich leider. Hab mir die manuell geöffnet/gespeicherten und die mit "type" formatierten mal in einem HEX-Editor angeschaut.

Manuell -> Leerzeichen zwischen den einzelnen Zeichen
"type" -> Punkte zwischen den einzelnen Zeichen

Nun benötige ich leider die Leerzeichen und nicht die Punkte face-confused

MfG
knechtibus
Member: knechtibus
knechtibus Aug 05, 2009 at 09:53:03 (UTC)
Goto Top
Hallo miteinander,

so ich habe jetzt noch ein bisschen rumprobiert und bin bis jetzt soweit das ich die Datei mit dem Editor öffnen kann. Wie ich die geöffnete Datei dann jedoch auch wieder in ein Verzeichnis abspeichern kann fehlt mir leider noch.

 notepad "C:\Test\Dat1.rf7"   

Wie man sieht sehr einfach. Fehlt aber noch das abspeichern in eine Datei.

MfG
knechtibus
Member: bastla
bastla Aug 05, 2009 at 10:03:21 (UTC)
Goto Top
Hallo knechtibus!

Auch wenn es wahrscheinlich eine andere (und jedenfalls bessere) Lösung gibt, als den "Editor" fernzusteuern, machbar wäre es (allerdings nur als "Bastelei" im wahrsten Sinn des Wortes face-wink):
@echo off & setlocal
set "Ordner=D:\Ordner Test"  
set "Datei=dat1.rf7"  

set S=%temp%\SaveAsText.vbs
>%S%  echo set Sh=WScript.CreateObject("WScript.Shell"):Datei=WScript.Arguments(1)  
>>%S% echo Cmd="notepad.exe """^&WScript.Arguments(0)^&"\"^&^Datei^& """"  
>>%S% echo Sh.Run Cmd:WScript.Sleep 1000:Sh.AppActivate Datei^&" - Editor":WScript.Sleep 100  
>>%S% echo Sh.SendKeys "%%du{ENTER}":WScript.Sleep 1000:Sh.SendKeys "%%db"  

for %%i in ("%Ordner%\%Datei%") do (  
    set "Dateiname=%%~ni"  
    copy "%%~i" "%Ordner%\%%~ni" >nul  
)

if exist "%Ordner%\%Dateiname%.txt" echo Textdatei bereits vorhanden! & goto :eof  
cscript //nologo %S% "%Ordner%" "%Dateiname%"  
del "%Ordner%\%Dateiname%"  
In den folgenden Zeilen sind jeweils Pausen von 1 Sekunde (da Angabe in ms mit dem Wert 1000) für das Starten des Editors und für das Speichern enthalten - vielleicht musst Du diese verlängern, um auf der sicheren Seite zu sein:
>>%S% echo Sh.Run Cmd:WScript.Sleep 1000:Sh.AppActivate Datei^&" - Editor":WScript.Sleep 100
>>%S% echo Sh.SendKeys "%%du{ENTER}":WScript.Sleep 1000:Sh.SendKeys "%%db"
Kurz zum Ablauf:
Zunächst wird das "Fernsteuerungs-Script" in VBS erstellt - dieses erwartet beim Aufruf als Parameter den Pfad (ohne abschließenden "\") und den Dateinamen.

Da der Editor in der Titelleiste (zumindest bei mir) nur den Dateinamen anzeigt (aber aufgrund dieser Information das Editor-Fenster gefunden werden muss) und auch beim Speichern keine Datei "dat1.rf7.txt", sondern "dat1.txt" entstehen soll, wird zunächst eine Kopie der Ausgangsdatei (wodurch diese als Sicherung erhalten bleibt) ohne Dateityp erzeugt und (scriptgesteuert) an den Editor zum "Neuspeichern" übergeben. Abschließend wird diese Kopie wieder entsorgt.

Grüße
bastla
Member: stbewo
stbewo Aug 05, 2009 at 10:08:12 (UTC)
Goto Top
Hi knechtibus,

öffne mal ein CMD prompt mit dem Parameter /U (= Unicode) und anschl. ein "Type Dat1.rt7 > Dat1.txt".

Gruß
Stefan
Member: knechtibus
knechtibus Aug 05, 2009 at 10:16:53 (UTC)
Goto Top
Hallo bastla,

also ein bisschen gruselig ist das ja schon ;) Wiedereinmal eine Lösung die sofort funktioniert und genau das tut, wie im Problem beschrieben. Ich danke dir vielmals für deine Hilfe, da wird ja langsam ein Kasten Bier fällig ;)

MfG
knechtibus
Member: bastla
bastla Aug 05, 2009 at 10:37:38 (UTC)
Goto Top
Hallo knechtibus!

Als "Lösung" würde ich die Spielerei da oben nicht bezeichnen - wenn Du damit eine Massenkonvertierung unter Aufsicht vornehmen willst, wäre das vielleicht grade noch ok; als Bestandteil eines unbeaufsichtigt ablaufenden Batches aber nicht - es kann zwischen den simulierten Tastendrücken einfach zu viel (oder zu wenig) passieren ...
Lässt sich etwas näher eingrenzen, um welches Format es bei den zu konvertierenden Dateien geht (Unicode würde ich eher nicht annehmen, da bei einem "type" ja eine implizite Konvertierung nach ASCII erfolgen sollte und es damit nicht geklappt hat)?

Grüße
bastla
Member: knechtibus
knechtibus Aug 05, 2009 at 11:13:44 (UTC)
Goto Top
Hallo bastla,

ich werd's mal ausprobieren und einen Testlauf mit deiner Lösung starten. Dann kann ich ja mal sehen wie sich diese Variante unter Realbedingungen schlägt. Bei dem Format handelt es sich um Dateien die ein Protokoll-Analysator ausgibt, es handelt sich um trace Dateien. Wie diese Dateien im einzelnen aufgebaut sind kann ich dir leider gar nicht sagen.

MfG
knechtibus
Member: knechtibus
knechtibus Aug 05, 2009 at 11:50:53 (UTC)
Goto Top
Hallo bastla,

habe da noch eine kurze Frage. Kann ich mit der von dir vorgeschlagenen Variante die .txt die erstellt wird, auch überschreiben und wenn ja wie? Will also, dass die erstellte .txt immer den gleichen Namen hat und den jeweiligen Voränger überschreibt.

MfG
knechtibus
Member: bastla
bastla Aug 05, 2009 at 13:14:41 (UTC)
Goto Top
Hallo knechtibus!
Kann ich mit der von dir vorgeschlagenen Variante die .txt die erstellt wird, auch überschreiben und wenn ja wie?
Etwa so:
@echo off & setlocal
set "Ordner=D:\Ordner Test"  
set "Datei=dat1.rf7"  

set S=%temp%\SaveAsText.vbs
>%S%  echo set Sh=WScript.CreateObject("WScript.Shell"):Datei=WScript.Arguments(1)^&".txt"  
>>%S% echo Cmd="notepad """^&WScript.Arguments(0)^&"\"^&^Datei^& """"  
>>%S% echo Sh.Run Cmd:WScript.Sleep 1000:Sh.AppActivate Datei^&" - Editor":WScript.Sleep 100  
>>%S% echo Sh.SendKeys "^s":WScript.Sleep 1000:Sh.SendKeys "%%db"  

for %%i in ("%Ordner%\%Datei%") do (  
    set "Dateiname=%%~ni"  
    copy "%%~i" "%Ordner%\%%~ni.txt" >nul  
)

cscript //nologo %S% "%Ordner%" "%Dateiname%"  
Grüße
bastla
Member: knechtibus
knechtibus Aug 06, 2009 at 08:12:48 (UTC)
Goto Top
Hallo bastla,

danke für die Erweiterung deiner Lösung. Leider funktioniert diese nur bedingt. Wenn der Editor die Datei überschreiben will, erfordert dies erst eine manuelle Bestätigung für das Überschreiben. Erst nach dem Bestätigen wird weiter fortgefahren. Meinst du man kann Dem irgendwie abhelfen?

MfG
knechtibus
Member: bastla
bastla Aug 06, 2009 at 11:07:59 (UTC)
Goto Top
Hallo knechtibus!

Eigentlich sollte es kein "Überschreiben" durch den Editor geben, sondern ein gewöhnliches "Speichern" - beim Aufruf des Editors wird ja bereits die Kopie (also "Dat1.txt") übergeben ...

Wie sieht denn der Ablauf aus, wenn Du "echo on" verwendest? Der Aufruf des Scripts müsste etwa so erfolgen:
D:\>cscript //nologo C:\DOKUME~1\Username\LOKALE~1\Temp\SaveAsText.vbs "D:\Ordner Test"
 "Dat1"
Dem als zweitem Parameter übergebenen Dateinamen fügt das Script dann noch ein ".txt" hinzu und ruft damit den Editor auf - um das zu testen, könntest Du zwischen den Zeilen 8 und 9 einfügen:
>>%S% echo WScript.Echo Cmd
Das Ergebnis müsste dann etwa so aussehen:
notepad "D:\Ordner Test\Dat1.txt"
Mehr kann ich von hier aus nicht abschätzen (bei mir funktioniert's nämlich) ...

Grüße
bastla
Member: knechtibus
knechtibus Aug 06, 2009 at 11:29:39 (UTC)
Goto Top
Hallo bastla,

habe das Problem soeben auf eine andere Art und Weise gelöst. Funktioniert nun auch so. Danke trotzdem für deine Mühe.
Habe allerdings noch ein anderes Problem mit einer anderen Batch-Datei. Diese sollte die aktuellste Datei finden und den Inhalt in eine .txt Datei kopieren. Nun soll diese jedoch nicht die aktuellste sondern die genau eins davor identifizieren und in eine .txt Datei kopieren. Folgender Code gilt als Grundlage:

@echo off & setlocal
set "Quelle=C:\TraceDat"  
set "Ziel=C:\akt_trace.txt"  
::Pause in Sekunden festlegen
set "Pause=10"  
pushd "%Quelle%"  
set "Zuletzt=_"  

:Schleife
set "Neueste="  
for /f "delims=" %%i in ('dir /b /on /a-d 2^>nul') do set "Neueste=%%i"  
echo Um %time:~,8% gefunden: %Neueste%
if defined Neueste if "%Neueste%" neq "%Zuletzt%" (  
    copy "%Neueste%" "%Ziel%">nul  
    set "Zuletzt=%Neueste%"  
    echo Um %time:~,8% kopiert: %Neueste%
)
::Pausieren
sleep %Pause%
goto :Schleife

Hoffe das ist nicht allzu umsändlich.

MfG
knechtibus
Member: bastla
bastla Aug 06, 2009 at 12:25:43 (UTC)
Goto Top
Hallo knechtibus!

Sollte so gehen:
set "Quelle=C:\TraceDat"  
set "Ziel=C:\akt_trace.txt"  
::Pause in Sekunden festlegen
set "Pause=10"  
pushd "%Quelle%"  
set "Zuletzt=_"  

:Schleife
set "Zweite="  
for /f "skip=1 delims=" %%i in ('dir /b /o-n /a-d 2^>nul') do if not defined Zweite set "Zweite=%%i"  
if defined Zweite echo Um %time:~,8% gefunden: %Zweite%
if defined Zweite if "%Zweite%" neq "%Zuletzt%" (  
    copy "%Zweite%" "%Ziel%">nul  
    set "Zuletzt=%Zweite%"  
    echo Um %time:~,8% kopiert: %Zweite%
)
::Pausieren
sleep %Pause%
goto :Schleife
Grüße
bastla
Member: knechtibus
knechtibus Aug 07, 2009 at 07:29:23 (UTC)
Goto Top
Hallo bastla,

entschuldige die verspätete Antwort. Konnte es leider erst heute ausprobieren. Dafür funktioniert es aber mal wieder einwandfrei. Danke dir für deine schnelle Hilfe und Lösung.
Eine kurze Frage hätte ich noch zum eigentlichen Thema dieses Beitrages. Die Funktionsweise ist absolut zufriedenstellend aber nun wollte ich, dass die erstellete .txt Datei immer den gleichen Namen erhält (z.B. test.txt) und dann in ein bestimmtes Verzeichnis (z.B. C:\test\Gruppe\) kopiert wird. Das Verzeichnis für die Quelle kann gleich bleiben. Hab schon ein bisschen rumgespielt aber er erstellt mir die Datei immer in dem Ordner wo er auch die "Quelldatei" im .rf7 Format findet.

MfG
knechtibus
Member: bastla
bastla Aug 07, 2009 at 08:02:43 (UTC)
Goto Top
Hallo knechtibus!

Das macht's eigentlich einfacher:
@echo off & setlocal
set "Ordner=D:\Ordner Test"  
set "Datei=dat1.rf7"  
set "Ziel=D:\Test\Gruppe"  
set "Dateiname=test"  

if not exist "%Ziel%" md "%Ziel%"  
set S=%temp%\SaveAsText.vbs
>%S%  echo set Sh=WScript.CreateObject("WScript.Shell"):Datei=WScript.Arguments(1)^&".txt"  
>>%S% echo Cmd="notepad """^&WScript.Arguments(0)^&"\"^&^Datei^& """"  
>>%S% echo Sh.Run Cmd:WScript.Sleep 1000:Sh.AppActivate Datei^&" - Editor":WScript.Sleep 100  
>>%S% echo Sh.SendKeys "^s":WScript.Sleep 1000:Sh.SendKeys "%%db"  

copy "%Ordner%\%Datei%" "%Ziel%\%Dateiname%.txt" >nul  

cscript //nologo %S% "%Ziel%" "%Dateiname%"  
Grüße
bastla
Member: knechtibus
knechtibus Aug 07, 2009 at 08:58:48 (UTC)
Goto Top
Hallo bastla,

ja das ist wirklich noch einfacher und dazu funktioniert es auch noch perfekt face-smile
Ich danke die für deinen unermüdlichen Einsatz und die daraus resultierenden Ergebnisse.

MfG
knechtibus