77575
Goto Top

Den Inhalt einer Datei komplett als Variable

Hallo,
ich möchte den komppletten Inhalt einer Textdatei als Variable setzen.
mit set /p wird aber nur die erste Zeile verwendet.

Hintergrund ist das ich mit eventcreate einen Eventlog eintrag erzeugen möchte der im Beschreibungsfeld den gesamten Text der Datei enthält. Leider kann ich bei eventcreate keine Datei angeben sondern nur einen String.

.z. Bsp.
set /P TEXT=<c:\temp\test.txt

eventcreate /d "%TEXT%" /t information /id 111111

gruss 01

Content-Key: 211970

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

Ausgedruckt am: 19.03.2024 um 08:03 Uhr

Mitglied: Endoro
Endoro 19.07.2013 um 21:39:28 Uhr
Goto Top
Hallo,

für eventcreate lässt sich kein Dateizeiger übergeben.
Alles muss in eine Kommandozeile passen, die jedenfalls kürzer ist als die maximale Batch-String-Länge von 8191 Zeichen.

lg
Mitglied: rubberman
rubberman 19.07.2013 um 21:51:47 Uhr
Goto Top
Hallo 01-01-01,

mal abgesehen von Endoros Einwand wegen der Stringlänge - Ich habe noch nie eine mehrzeilige Eventbeschreibung gesehen. Natürlich wird eine zu lange Zeile in der Ereignisanzeige automatisch umgebrochen. Das hat aber nichts damit zu tun, dass dort Zeilenumbrüche im Text hinterlegt wären.
Ergo: Schreib die gesamte Beschreibung gleich in eine Zeile der Textdatei, dann kannst du sie auch vernünftig auslesen und von mir aus in eine Variable packen ...

Grüße
rubberman
Mitglied: Herbrich19
Herbrich19 20.07.2013 um 02:36:21 Uhr
Goto Top
Hallo,

Ansonsten kannst du noch mit VB.NET eine Console Anwendung erstellen die mit der Eventlog Klasse die Datei in eine Variable einließt und dann den String in Eventlog einträgt.

Du brauchst ein StreamReader (System.IO), und ein EventLog (ich glaube^^) (System.Diagnostic). Dann könntest du das Programm nach C:\Windows\System32 Kopieren und dann kannst du es wie ein normales CMD Syntax nutzen.

Und der Einwand mit den Zeilenumbrüchen, den habe ich auch schon gesehen, dieser ist aber earscheinlich ehr kulturell bedingt, weil es Technisch zumindest möglich ist (ich habe es mit einer VB.NET GUI getestet). Alerdings ist da bitte auch noch der umstand zu beachten das die WriteLogEntry Sub oder jede andere Parameter übergabe keine Zeilenumbrüche unsterstützt. Da muss man dann z.B. wie in meinen Fall mit vbNewLine Arbeiten. Aber möglich ist es.

LG, Herbrich
Mitglied: rubberman
rubberman 20.07.2013 um 12:14:13 Uhr
Goto Top
Hallo.

Möglich ist das auch mit Batch-Bordmitteln und dem EVENTCREATE Tool. Aber schön wird das nicht und fehleranfällig (insbesondere bei der von Endoro angesprochenen maximalen Stringlänge) wird das auch. Ich kann's ja mal vorturnen, letztlich aber immer noch davon abraten ...
@echo off &setlocal

REM Deine temporäre Datei. (anpassen)
set "file=test.txt"  

REM Aktuelle OEM Codepage zwischenspeichern.
for /f "tokens=2 delims=:" %%i in ('chcp') do set /a "oemcp = %%~ni"  

REM Codepage auf Windows-1252 stellen, um Umlaute korrekt übergeben zu können.
>nul chcp 1252

REM Datei erstellen. Bei etwa 8100 Byte Dateigröße wäre übrigens Schluss mit lustig, da die Gesamtlänge der Kommandozeile sonst 8191 Zeichen überschreitet.
REM (Du verarbeitest natürlich deine bestehende Datei und schmeißt diesen Block raus! Nur für mich zum Testen ...)
>"%file%" (  
  echo \"Benutzerdefiniertes Ereignis\".  
  echo(
  echo Mit
  echo Zeilenumbrüchen
  echo für
  echo Testzwecke!
)

REM Carriage Return
for /f %%i in ('copy /z "%~f0" nul') do set "cr=%%i"  
REM Line Feed (Die zwei Leerzeilen danach sind relevant!)
set lf=^


REM Verzögerte Variablenerweiterung, um den Text zusammen zu bauen und mit Zeilenumbrüchen arbeiten zu können.
setlocal EnableDelayedExpansion

REM Datei einlesen und einen Windows-Zeilenumbruch (CrLf) hinter jede Zeile packen.
set "txt="  
<"!file!" (  
  for /f %%i in ('type "!file!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "line=" &set /p "line="  
    set "txt=!txt!!line!!cr!!lf!"  
  )
)

REM Dein Event erstellen.
eventcreate /t information /id 1000 /d "!txt:~0,-2!"  

REM Verzögerte Variablenerweiterung wird nicht weiter benötigt.
endlocal

REM Zurück zur OEM Codepage.
>nul chcp %oemcp%

REM Ggf. Datei löschen.
del "%file%"  

pause

Grüße
rubberman
Mitglied: 77575
77575 22.07.2013 um 18:14:04 Uhr
Goto Top
Hallo rubberman,

das funktioniert einwandfrei.
Vielen Dank.

gruss 01
Mitglied: Computerseelsorger
Computerseelsorger 10.09.2014 um 16:39:40 Uhr
Goto Top
Hi!

Das sieht sehr interessant aus!

Ist es auch möglich, dass das Script/Batch eine vorhandene "log.txt", um dies Beschreibungen darin in den Event zu schreiben?

Wenn ja: Wie müsste ich den Inhalt der der "log.txt" aussehen, das der mehrzeilige Inhalt auch im Event-Log mehrzeilig dargestellt wird?
Wo muss die Log-Datei liegen, bzw. wo gebe ich den Ablageort vor?


Beste Grüße,
CS
Mitglied: rubberman
rubberman 10.09.2014 aktualisiert um 18:56:04 Uhr
Goto Top
Hallo Computerseelsorger.

Ist es auch möglich, dass das Script/Batch eine vorhandene "log.txt", um dies Beschreibungen darin in den Event zu schreiben?
Ich hatte gehofft der Code wäre wirklich ausreichend gut kommentiert face-sad Siehe Zeile 13 oben.

Wie müsste ich den Inhalt der der "log.txt" aussehen
Keine Ahnung. Wie sieht er denn aus?

Wo muss die Log-Datei liegen, bzw. wo gebe ich den Ablageort vor?
Siehe Zeilen 3 und 4 oben.

Ergo: Alles erklärt. Lesen musst du allerdings selbst.

Nach wie vor gilt die Warnung vor Risiken und Nebenwirkungen ...

Grüße
rubberman
Mitglied: Computerseelsorger
Computerseelsorger 11.09.2014 um 08:19:17 Uhr
Goto Top
Super, danke!
Ja, richtig. Lesen muss man schon selber! Hat prima geklappt!