ortnerbeni
Goto Top

Textdatei mit Batch formatieren

Hallo Forum...

Ich habe eine Frage zum formatieren einer Txt mittels Batch Datei.


totalphysicalmemory = "2136887296"
name = "SB-L-601"
name = "Intel(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz"
size = "80023749120"



Möchte gerne dass meine txt- Datei folgendes macht.

"totalphysicalmemory " sollte zu Arbeitsspeicher werden und "Zahl(2136887296)" soll /1024 /1024 /1024 dividiert werden (also Zahl durch 3 mal 1024 dividieren)

Das erste "name" soll Zu Computername geändert werden.

Das zweite "name" soll zu Prozessor geändert werden.

"size" soll zu Festplattenkapazität geändert werden. "Zahl(80023749120)" soll /1024 /1024 /1024 dividiert werden


Die Ausgabe sollte dann so aussehen:

Arbeitsspeicher = 1.99 GB
Computername = SB-L-601
Prozessor = Intel(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz
Festplattenkapazität = 74.52 GB



Danke

Grüße
Benni

Content-ID: 140330

Url: https://administrator.de/forum/textdatei-mit-batch-formatieren-140330.html

Ausgedruckt am: 22.12.2024 um 18:12 Uhr

linux42live
linux42live 12.04.2010, aktualisiert am 18.10.2012 um 18:41:42 Uhr
Goto Top
Hallo Benni,

lies dir doch mal folgenden Beitrag durch.
Per Batch ein Wort in Einer Textdatei gegen ein anderes ersetzen

Wenn du dann 2 Durchgänge des Ersetzen machst, solltest du auch das Problem mit dem "name" in den Griff bekommen.

Wieviele Dateien hast du denn zu bearbeiten? Ich kann für sowas Auto-it empfehlen. (http://www.autoitscript.com/autoit3/index.shtml).

Letzte Frage:
Welches OS? Weil unter Linux gäbe es ja noch Bash oder Perl.

MfG

linux42live
89485
89485 12.04.2010, aktualisiert am 18.10.2012 um 18:41:42 Uhr
Goto Top
Hi Benni,
ich hab in einem anderen Beitrag das hier gefunden

Hier ist noch der Link dazu: Batch - Remote PC Daten auslesen

echo Systeminfo auslesen...
Systeminfo /S "IP-Adresse" >> systeminfo.txt
echo - Hostname...
findstr "Hostname" systeminfo.txt >> Daten_%pchost%.txt
echo - Betriebssystemname...
findstr "Betriebssystemname" systeminfo.txt >> Daten_%pchost%.txt
echo - Betriebssystemversion...
findstr "Betriebssystemversion" systeminfo.txt >> Daten_%pchost%.txt
echo - Ursprüngliches Installationsdatum...
findstr "Ursprüngliches Installationsdatum" systeminfo.txt >> Daten_%pchost%.txt
echo - Systemhersteller...
findstr "Systemhersteller" systeminfo.txt >> Daten_%pchost%.txt
echo - Systemmodell...
findstr "Systemmodell" systeminfo.txt >> Daten_%pchost%.txt
echo - Gesamter physikalischer Speicher...
findstr "Gesamter" systeminfo.txt >> Daten_%pchost%.txt
echo - Domaene...
findstr "Dom„ne:" systeminfo.txt >> Daten_%pchost%.txt
echo - Anmeldeserver...
findstr "Anmeldeserver" systeminfo.txt >> Daten_%pchost%.txt
echo. >> Daten_%pchost%.txt
echo. >> Daten_%pchost%.txt
pause

Er erstellt dabei 2 Txtfiles in das Verzeichnis, wo auch die Batchdatei liegt...

LG
Batchliebhaber
ortnerbeni
ortnerbeni 12.04.2010 um 10:46:40 Uhr
Goto Top
Hi Forum

Habe win xp pro...

ich habe 10+ Text-Datein...

Hab mir den Link angeschaut...

Verstehe aber nicht:

@echo off
setlocal enabledelayedexpansion

set "filename=text.txt" Welche Datein muss ich hier angeben bzw anpassen
set "tempfile=tmptxt.txt"

for /F "delims=" %%a in (%filename%) do (
set text=%%a
set text=!text:^&=und!>>%tempfile% statt dem "^&" meinen text eigeben oda..?
)

del %filename%


Grüße
Benni
bastla
bastla 12.04.2010 um 11:32:20 Uhr
Goto Top
Hallo Benni!

Grundsätzlich besteht zunächst das Problem, wie schon zuletzt, darin, "dem Batch" klarzumachen, welches der beiden vorhandenen "name" gerade an der Reihe ist - ansonsten wäre es ein simples "Suchen - Ersetzen", wie wir es hier schon öfter hatten.

Solange gewährleistet wäre, dass es immer genau die 4 dargestellten Zeilen gibt, könnte ja einfach anhand der Zeilennummer der entsprechende Text gewählt werden ...
Zur Umrechnung in GB: Da Batch keine Dezimalzahlen verarbeiten kann, würde ich hier zu einem VBScript greifen und dieses etwa so in den Batch integrieren:
...
set U=%temp%\Umrechnung.vbs
>%U% echo WScript.Echo Replace(FormatNumber(WScript.Arguments(0)/1024/1024/1024,2),",",".")  
...
for /f %%i in ('cscript //nologo %U% "2136887296"') do set "GB=%%i"  
echo %GB%
Natürlich würde beim Aufruf eine Variable anstelle der Konstanten "2136887296" Verwendung finden.

Grüße
bastla
ortnerbeni
ortnerbeni 12.04.2010 um 11:43:33 Uhr
Goto Top
Hi

Das Problem mit dem "name" ist immer in der Reihenfolge.

Knast mir vl die ganze bat. datei posten.

Weis nicht wie ich suche und ersetze.

Danke

Grüße
Benni
bastla
bastla 12.04.2010 um 15:18:53 Uhr
Goto Top
Hallo Benni!

Wenn ich davon ausgehe, dass es sich hier um die Fortsetzung Deines vorigen Themas handelt, ließe sich das Ermitteln der Werte mit der Formatierung verbinden - teste (ich hab's nämlich bisher nicht gemacht face-wink) dazu doch bitte mal folgenden Batch (zunächst wieder für eine einzelne Datei):
@echo off & setlocal
set "Datei=D:\Computer-Info.txt"  

set U=%temp%\Umrechnung.vbs
>%U% echo WScript.Echo Replace(FormatNumber(WScript.Arguments(0)/1024/1024/1024,2),",",".")  

set "TempInfo=%temp%\Info.txt"  
move "%Datei%" "%TempInfo%"  
for %%i in ("[COMPUTER_SYSTEM_0];totalphysicalmemory;Arbeitsspeicher;U","[COMPUTER_SYSTEM_0];name;Computername;N","[PROCESSOR_0];name;Prozessor;N","[HARDDISK_DRIVE_0];size;Festplattenkapazität;U") do (  
    for /f "tokens=1-4 delims=;" %%a in (%%i) do for /f "delims=:" %%n in ('findstr /n "^" "%TempInfo%"^|findstr /l /c:":%%a"') do call :ProcessLine %%n "%%b" "%%c" "%%d"  
)
del "%TempInfo%"  
goto :eof

:ProcessLine
set Wert=
for /f "delims=" %%t in ('more +%1 "%TempInfo%"^|findstr /b /c:"%~2 = "') do if not defined Wert set Wert=%%t  
if not defined Wert goto :eof
if /i %4="U" for /f %%w in ('cscript //nologo %U% %Wert%') do set Wert="%%w"  
>>"%Datei%" echo %~3 = %Wert%  
goto :eof
Um auch nochmals Bibers Überlegung aufzugreifen: Eine Abfrage der gesuchten Werte über WMI (würde die Sicherheit, auch die richtigen Daten zu verarbeiten, wesentlich erhöhen) kommt nicht in Frage?

Grüße
bastla
ortnerbeni
ortnerbeni 12.04.2010 um 16:20:46 Uhr
Goto Top
Hallo Bastla..!

Danke für das Script.

Hier is mein Problem mit dem ich dich die ganze Zeit belaste.

Ich habe einen Server der Clients in einer Domäne Auf Hardware und Software scannt und dies in einem Web-interface zeigt (Werden auch im Dateisystem in TXT Files gespeichert).

Da es eine Linux- Server ist habe ich mir eine Bat-Datei geschrieben, die mir diese TXT datein Von Linux zu Windows kopiert. (Das Funktioniert auch sehr gut und passt)

Diese Datein sehen folgendermaßen aus:


Software: Name der Datei: sb-l-601.hji.local.sw_Software_.txt, sb-p-ghost.hji.local.sw_Software_.txt

Hardware: Name der Datei: sb-l-601.hji.local.hw_Hardware_.txt; sb-p-ghost.hji.local.hw_Hardware_.txt


Software
sb-l-601.hji.local.sw_Software_.txt

Hier ein Ausschnitt einer Software TXT:


[KB950760]
displayversion = 1
binaryname =
displayname = Sicherheitsupdate für Windows XP (KB950760)
installsize = -1
uninstallstring = \"C:\\WINDOWS\\$NtUninstallKB950760$\\spuninst\\spuninst.exe\"

[KB950762]
displayversion = 1
binaryname =
displayname = Sicherheitsupdate für Windows XP (KB950762)
installsize = -1
uninstallstring = \"C:\\WINDOWS\\$NtUninstallKB950762$\\spuninst\\spuninst.exe\"

[{F7B0E599-C114-4493-BC4D-D8FC7CBBABBB}]
displayversion = 2.1.4
displayname = 32 Bit HP CIO Components Installer
uninstallstring = MsiExec.exe /I{F7B0E599-C114-4493-BC4D-D8FC7CBBABBB}

[KB968816_WM9]
displayversion =
binaryname =
displayname = Sicherheitsupdate für Windows Media Player (KB968816)
installsize = -1
uninstallstring = \"C:\\WINDOWS\\$NtUninstallKB968816_WM9$\\spuninst\\spuninst.exe\"

[{C09FB3CD-3D0C-3F2D-899A-6A1D67F2073F}.KB956860]
displayversion =
displayname =
uninstallstring =

[{300A2961-B2B5-4889-9CB9-5C2A570D08AD}]
displayversion = 6.11.1.404
binaryname =
displayname = Debugging Tools for Windows (x86)
installsize = 40398848
uninstallstring = MsiExec.exe /I{300A2961-B2B5-4889-9CB9-5C2A570D08AD}



Dieses Script Filtert mir den Wert "displayname ="

set "Ordner=c:\Opsi_Export"
set "Maske=*_Software_.txt"

for %%i in ("%Ordner%\%Maske%") do (
move "%%i" "%temp%\%%~nxi"
for /f "tokens=2*" %%a in ('findstr /b /c:"displayname = " "%temp%\%%~nxi"') do >>"%%i" echo\%%b
del "%temp%\%%~nxi"
)


Ergebniss:

Perfekt.


Hardware
sb-l-601.hji.local.hw_Hardware_.txt


Hier ein Ausschnitt einer Hardware TXT:


[COMPUTER_SYSTEM_0]
totalphysicalmemory = "2136887296"
vendor = "Dell Inc."
name = "SB-L-601"
systemtype = "X86-based PC"
serialnumber = ""
model = "Latitude D830"
description = "AT/AT COMPATIBLE"

[HARDDISK_DRIVE_0]
size = "80023749120"
vendor = "(Standardlaufwerke)"
name = "FUJITSU MHW2080BJ G2"
sectors = "156296385"
serialnumber = ""
heads = 255
cylinders = "9729"
model = "FUJITSU MHW2080BJ G2"
partitions = 3
description = "Laufwerk"



Dieses Script Filtert mir den die gewünschten Werte:
(Aber ich muss die Dateiname manual eingeben. Also die Wariable Datei immer neu belegen und speichern und starten)


set "Datei=C:\Opsi_Export\sb-l-601.hji.local.hw_Hardware_.txt"

set "TempInfo=%temp%\Info.txt"
move "%Datei%" "%TempInfo%"
for %%i in ("[COMPUTER_SYSTEM_0];totalphysicalmemory","[COMPUTER_SYSTEM_0];name","[PROCESSOR_0];name","[HARDDISK_DRIVE_0];size") do (
for /f "tokens=1-2 delims=;" %%a in (%%i) do for /f "delims=:" %%n in ('findstr /n "^" "%TempInfo%"^|findstr /l /c:":%%a"') do call :ProcessLine %%n "%%b"
)
pause
del "%TempInfo%"
goto :eof

:ProcessLine
set Gefunden=
for /f "delims=" %%t in ('more +%1 "%TempInfo%"^|findstr /b /c:"%~2 = "') do if not defined Gefunden (set "Gefunden=True" & >>"%Datei%" echo\%%t)
goto :eof



Ergebniss:

totalphysicalmemory = "2136887296"
name = "SB-L-601"
name = "Intel(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz"
size = "80023749120"

Ist schon sehr gut aber besser währe es wenn es so ausieht:

Arbeitsspeicher = 1.99 GB
Computername = SB-L-601
Prozessor = Intel(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz
Festplattenkapazität = 74.52 GB


Also ich habe 30+ Software TXT- Datein und 30+ Hardware TXT-Datein in einem Ordner.

Am besten ich hätte ein Batch-Script das alles dies erfüllt.

Danke

Grüße
Benni
bastla
bastla 12.04.2010 um 16:35:56 Uhr
Goto Top
Hallo Benni!

Natürlich lässt sich um das Ganze noch ein Schleifchen wickeln:
@echo off & setlocal
set "Ordner=D:\Computer-Info"  

set U=%temp%\Umrechnung.vbs
>%U% echo WScript.Echo Replace(FormatNumber(WScript.Arguments(0)/1024/1024/1024,2),",",".")  

pushd "%Ordner%"  
for /f "delims=" %%f in ('dir /b s*_Hardware.txt') do (  
    move "%%f" "%Temp%\%%~nxd"  
    for %%i in ("[COMPUTER_SYSTEM_0];totalphysicalmemory;Arbeitsspeicher;U","[COMPUTER_SYSTEM_0];name;Computername;N","[PROCESSOR_0];name;Prozessor;N","[HARDDISK_DRIVE_0];size;Festplattenkapazität;U") do (  
        for /f "tokens=1-4 delims=;" %%a in (%%i) do for /f "delims=:" %%n in ('findstr /n "^" "%Temp%\%%~nxd"^|findstr /l /c:":%%a"') do call :ProcessLine %%n "%%b" "%%c" "%%d" "%%f"  
    )
    del "%Temp%\%%~nxd"  
)
goto :eof

:ProcessLine
set Wert=
for /f "delims=" %%t in ('more +%1 "%TempInfo%"^|findstr /b /c:"%~2 = "') do if not defined Wert set "Wert=%%~t"  
if not defined Wert goto :eof
if /i %4="U" for /f %%w in ('cscript //nologo %U% %Wert%') do set "Wert=%%w"  
>>%5 echo %~3 = %Wert%
goto :eof
wobei mit "%%f" in der ersten Schleife (bzw dem Übergabeparameter %5 im Unterprogramm) die "Originaldatei" und mit "%Temp%\%%~nxd" die temporäre Kopie davon angesprochen wird - das Setzen der Variablen %Datei% wäre zwar eine mögliche Alternative, allerdings wäre dann entweder "delayedExpansion" oder ein weiteres Unterprogramm nötig, was ich beides vermeiden möchte.

Nähere Erläuterungen kann ich bei Bedarf später nachreichen.

Grüße
bastla
ortnerbeni
ortnerbeni 13.04.2010 um 08:03:24 Uhr
Goto Top
Super Danke Bastla...

Aber die Bat funktioniert nicht ganz.

Fehler:

http://img42.imageshack.us/img42/9837/fehlerwe.jpg

Grüße
Benni
bastla
bastla 13.04.2010 um 09:00:11 Uhr
Goto Top
Hallo Benni!

Ich hoffe, die meisten Fehler sind jetzt weg:
@echo off & setlocal
set "Ordner=D:\Computer-Info"  

set U=%temp%\Umrechnung.vbs
>%U% echo WScript.Echo Replace(FormatNumber(WScript.Arguments(0)/1024/1024/1024,2),",",".")  

pushd "%Ordner%"  
for /f "delims=" %%f in ('dir /b s*_Hardware_.txt') do (  
    move "%%f" "%Temp%\%%~nxf"  
    for %%i in ("[COMPUTER_SYSTEM_0];totalphysicalmemory;Arbeitsspeicher;U","[COMPUTER_SYSTEM_0];name;Computername;N","[PROCESSOR_0];name;Prozessor;N","[HARDDISK_DRIVE_0];size;Festplattenkapazität;U") do (  
        for /f "tokens=1-4 delims=;" %%a in (%%i) do for /f "delims=:" %%n in ('findstr /n "^" "%Temp%\%%~nxf"^|findstr /l /c:":%%a"') do call :ProcessLine %%n "%%b" "%%c" "%%d" "%%f"  
    )
    del "%Temp%\%%~nxf"  
)
popd
goto :eof

:ProcessLine
set Wert=
for /f "tokens=2 delims== " %%t in ('more +%1 "%Temp%\%~nx5"^|findstr /b /c:"%~2 = "') do if not defined Wert set "Wert=%%~t"  
if not defined Wert goto :eof
if /i %4=="U" for /f %%w in ('cscript //nologo %U% %Wert%') do set "Wert=%%w"  
>>%5 echo %~3 = %Wert%
goto :eof
Grüße
bastla
ortnerbeni
ortnerbeni 13.04.2010 um 09:15:46 Uhr
Goto Top
Hallo Bastla.

Diese Batch bearbeitet 1 Datei und schreibt nur

Arbeitsspeicher = 1.99
Computername = SB-P-418


Grüße
Benni

Wenn ich es 1 mal ausführe bearbeitet es nur eine Datei beim 2tenmal löscht er die bearbeitete Datei und formatiert eine andere .....
bastla
bastla 13.04.2010 um 09:56:59 Uhr
Goto Top
Hallo Benni!

Kann ich so zwar nicht nachvollziehen - allerdings wäre es mE ohnehin sinnvoller, die Ergebnisdateien in einem anderen Ordner zu sammeln - versuch es mal damit:
@echo off & setlocal
set "Ordner=D:\Computer-Info"  
set "Ergebnis=D:\Computer-Info-bearbeitet"  

set U=%temp%\Umrechnung.vbs
>%U% echo WScript.Echo Replace(FormatNumber(WScript.Arguments(0)/1024/1024/1024,2),",",".")  

md "%Ergebnis%" 2>nul  
for %%f in ("%Ordner%\s*_Hardware_.txt") do (  
    del "%Ergebnis%\%%~nxf" 2>nul  
    for %%i in ("[COMPUTER_SYSTEM_0];totalphysicalmemory;Arbeitsspeicher;U","[COMPUTER_SYSTEM_0];name;Computername;N","[PROCESSOR_0];name;Prozessor;N","[HARDDISK_DRIVE_0];size;Festplattenkapazität;U") do (  
        for /f "tokens=1-4 delims=;" %%a in (%%i) do for /f "delims=:" %%n in ('findstr /n "^" "%%f"^|findstr /l /c:":%%a"') do call :ProcessLine %%n "%%b" "%%c" "%%d" "%%f"  
    )
)
goto :eof

:ProcessLine
set Wert=
for /f "tokens=2 delims== " %%t in ('more +%1 %5^|findstr /b /c:"%~2 = "') do if not defined Wert set "Wert=%%~t"  
if not defined Wert goto :eof
if /i %4=="U" for /f %%w in ('cscript //nologo %U% %Wert%') do set "Wert=%%w"  
>>"%Ergebnis%\%~nx5" echo %~3 = %Wert%  
goto :eof
Grüße
bastla