
@echo off
setlocal EnableDelayedExpansion
echo { >>post.json
FOR /F "tokens=1,2 skip=1 delims==" %%a in (hardware.txt) do (
set temp=%%a
set res=%%b
call :Trim result !res!
call :Trim tem !temp!
for /f "delims=0123456789" %%i in ("!result!") do (
set var=%%i
echo !var!
if defined var (
echo "!tem!" : "!result!", >> post.json
) else (
echo "!tem!" : !result!, >> post.json
)
)
)
echo } >> post.json
:Trim
SetLocal EnableDelayedExpansion
set Params=%*
for /f "tokens=1*" %%a in ("!Params!") do EndLocal & set %1=%%b
exit /b
Ich habe eine For-Schleife erstellt, die aus einer Datei namens hardware.txt liest, die Informationen im folgenden Format enthält:
os = Microsoft Windows 10 Pro
osVersion = 10.0.19042
username = desktop-ujer9ka\arron
brand = ASUSTeK COMPUTER INC.
model = X556UR
ram = 12
storage = 934
macAddress = 00:FF:F7:29:ED:06
Ich erhalte JSON im folgenden Format:
{
"os" : "Microsoft Windows 10 Pro" ,
"osVersion" : "10.0.19042" ,
"username" : "desktop-ujer9ka\arron" ,
"brand" : "ASUSTeK COMPUTER INC." ,
"model" : "X556UR" ,
"macAddress" : "00:FF:F7:29:ED:06" ,
"processor" : "Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz" ,
}
In der zweiten For-Schleife wird die Else-Bedingung nicht ausgeführt. Wenn es einen anderen einfachen Weg gibt, lassen Sie es mich bitte wissen, oder wenn mir jemand dabei helfen kann, wäre das großartig. Ich brauche die zweite For-Schleife, weil ich prüfen möchte, ob die Variable eine Zahl ist oder nicht, da ich eine Zahl im JSON brauche. Ich weiß auch nicht, wie ich das letzte Komma nach der Zeichenfolge entferne, um ein ordentliches JSON zu erstellen.
Antwort1
@echo off && cd /d "%~dp0"
setlocal EnableDelayedExpansion
for /f %%N in ('find /c "=" ^<.\hardware.txt')do set "_n=%%~N" && (
for /l %%L in (1,1,%%~N)do set /p _line_%%~L=)<.\hardware.txt
%:^(
for /L %%L in (1 1 %_n%)do for %%G in (" "," "," "," ")do set "_line_%%~L=!_line_%%~L:%%~G=!"
for /L %%L in (1 1 %_n%)do if "!_line_%%~L:~-1!"==" " (set "_line_%%~L=!_line_%%~L:~0,-1!" & goto %:^()
for /L %%L in (1 1 %_n%)do for /f usebackq^tokens^=1-2*delims^=^= %%i in (`
call echo\!_line_%%~L!`)do set "_line_%%~L="%%~i@%%~j""
>>.\post.json (
for /L %%L in (2 1 %_n%)do if %%~L equ 2 (
echo\^{
echo\ !_line_%%~L: @ =" : "!,
)else if %%~L neq %_n% (
echo\ !_line_%%~L: @ =" : "!,
)else (
echo\ !_line_%%~L: @ =" : "!
echo\^}
)
) && endlocal
Ich erwäge:
Sie müssen die erste Zeile Ihrer Datei hardware.txt überspringen, da Ihr
For /F
Schleifenbefehl verwendetskip=1
, dieFor /L
Schleife also2
nicht bei beginnt1
und daher auch eine Zeile/Variable der Datei „übersprungen“ wird.Die meisten Ihrer Zeichenfolgen in der Hardwaredatei wurden von Skripten abgerufen, die ich vermutlich wie den
wmic
Befehl verwendet habe, und zur Datei umgeleitet. Folglich wurden hier die zusätzlichen Leerzeichen am Ende der Zeile am Ende der Zeilen/Zeichenfolgen hinzugefügt.Ich habe nicht verstanden (Versagen meines begrenzten Englisch), was Sie dort tun müssen, wo Sie Zahlen ermitteln möchten/müssen. Jede zusätzliche Erklärung kann die Antwort auch an dieser Stelle an Ihre Bedürfnisse anpassen.
Obwohl ich bereits davon ausgehe, dass Ihre Befehle durch die Verwendung von erhalten wurden
wmic
, und auch nicht weiß, welcher Inhalt in der ersten Zeile oder ihrem Ursprung zu springen ist, füge ich einen weiteren Bat hinzu, der die Informationen ähnlich Ihrer Datei hardware.txt erhält, die Ausgabe jedoch bereits im Dateiformat .json umleitetArtikel4.beantwortet diesen Teil Ihrer Frage definitiv nichtWenn es einen anderen einfachen Weg gibt, lassen Sie es mich bitte wissen, verzeihen Sie mir, manche Dinge möchte ich lieber neu machen, um die Handhabung bei zukünftigen Bearbeitungen/Anpassungen zu erleichtern
Bei der Verwendung
find "="
in der erstenFor /F
Schleife zähle ich die Zeilen mit „=“ und berücksichtige/verwende eine Datei, die der in Ihrer Frage geposteten Datei „hardware.txt“ entspricht. Ich schlage daher vor, dass Sie mit denselben Zeilen und der entsprechenden Anzahl von Zeilen testen, die in der Frage gepostet wurden. Wenn es Unterschiede gibt, lassen Sie es mich bitte wissen …Ich nehme an, die in Punkt 1 genannte Verwendung6.kann es obsolet/unproduktiv machen
skip=1
, daher füge ich unten einen vollständigen Code sowie den Vorschlagscode hinzu, um die Zeichenfolgen ohne zusätzliche Leerzeichen am Ende der Zeilen zu erhalten ...
- Ohne
skip=1
InFor
-Schleifen:
:: for /L %%L in (2 1 %_n%)do if %%~L equ 2 ()else if()else()...
:: ↓ ↓
:: for /L %%L in (1 1 %_n%)do if %%~L equ 1 ()else if()else()...
@echo off && cd /d "%~dp0"
if not defined _fjson (call setlocal EnableDelayedExpansion
set "_fjson=post.json" & call "%~f0" >"%~dp0\!_fjson!"
timeout /t 05 | type "!_fjson!" & endlocal & goto :eof
);= else <con call set "_spc=" "," "," "," ""
for /f %%N in ('find /c "=" ^<.\hardware.txt')do set "_n=%%~N" & (
for /l %%L in (1,1,%%~N)do set /p _line_%%~L=)<.\hardware.txt
%:^(
for /L %%L in (1,1,%_n%)do for %%G in (;%_spc%)do (set "_line_%%~L=!_line_%%~L:%%~G=!"
if "!_line_%%~L:~-1!"==" " call set "_line_%%~L=!_line_%%~L:~0,-1!" && goto %:^()
for /L %%L in (1,1,%_n%)do for /f usebackq^tokens^=1-2*delims^=^= %%i in (
`call echo\!_line_%%~L!`)do call set "_line_%%~L= "%%~i@%%~j"" && (
if %%~L equ 1 (echo\^{&& <con: call echo\!_line_%%~L: @ =" : "!^
)else if not %%~L equ %_n% (call echo\!_line_%%~L: @ =" : "!^,
)else call echo\!_line_%%~L: @ =" : "! && echo\^});=
- Holen Sie sich Zeichenfolgen im
.json
Format und ohne zusätzliche Leerzeichen am Ende der Zeile
@echo off && setlocal EnableDelayedExpansion
:: var line_1 :: os = Microsoft Windows 10 Pro
title <nul & title set variable line_1
for /f usebackq^tokens^=4delims^=^<^> %%i in (`
wmic os get caption /format:xml ^| find "VALUE"
`)do set "_line_1="os" : "%%~i""
:: var line_2 :: osVersion = 10.0.19042
title <nul & title set variable line_2
for /f usebackq^tokens^=4delims^=^<^> %%i in (`
wmic os get version /format:xml ^| find "VALUE"
`)do set "_line_2="osVersion" : "%%~i""
:: var line_3 :: username = desktop-ujer9ka\arron
title <nul & title set variable line_3
for /f usebackq^tokens^=4delims^=^<^> %%i in (`
wmic /node:. computersystem get username /format:xml ^| find "VALUE"
`)do set "_line_3="username" : "%%i""
:: var line_4 :: brand = ASUSTeK COMPUTER INC.
title <nul & title set variable line_4
for /f usebackq^tokens^=4delims^=^>^< %%i in (`
wmic csproduct get vendor /format:xml ^| find "VALUE"
`)do set "_line_4="brand" : "%%~i""
:: var line_5 :: model = X556UR
title <nul & title set variable line_5
for /f usebackq^tokens^=4delims^=^>^< %%i in (`
wmic csproduct get name /format:xml ^| find "VALUE"
`)do set "_line_5="model" : "%%~i""
:: var line_6 :: ram = 12
title <nul & title set variable line_6
for /f usebackq^tokens^=4delims^=^>^< %%i in (`
wmic computersystem get totalphysicalmemory /format:xml ^|find "VALUE"`)do for /f %%G in ('
mshta "vbscript:Execute("createobject(""scripting.filesystemobject""^).GetStandardStream(1^).write(Round(%%i/1073741824^)^):close")"^|more
')do set "_line_6="ram" : "%%~G""
:: var line_7 :: storage = 934
title <nul & title set variable line_7
for /f usebackq^tokens^=4delims^=^>^< %%i in (`
wmic logicaldisk where Caption^="C:" get Size /format:xml^|find "VALUE"`)do for /f %%G in ('
mshta "vbscript:Execute("createobject(""scripting.filesystemobject""^).GetStandardStream(1^).write(Round(%%i/1073741824^)^):close")"^|more
')do set "_line_7="storage" : "%%G""
:: var line_8 macAddress = 00:FF:F7:29:ED:06
title <nul & title set variable line_8
for /f usebackq^tokens^=4delims^=^>^< %%i in (`
wmic path Win32_NetworkAdapter where "PNPDeviceID like '%%%%PCI%%%%' and NetConnectionStatus='2' and AdapterTypeID='0'" get MacAddress /format:xml ^| find "VALUE"
`)do set "_line_8="macAddress" : "%%~i""
:: var line_9 :: processor = Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
title <nul & title set variable line_9
for /f usebackq^tokens^=4delims^=^>^< %%i in (`
wmic CPU get NAME /format:xml ^| find "VALUE"
`)do set "_line_9="processor" : "%%~i""
:: var lines 1-9 :: Writing lines from 1 to 9 in post.json file
title <nul & title write line 1-9 to file: .\post.json
>.\post.json (
for /L %%L in (1 1 9)do for /f usebackq^delims^= %%i in (`
"echo\ !_line_%%~L!"`)do if %%~L equ 1 (
echo\^{ && echo\%%~i,)else if %%~L neq 9 (
echo\%%~i,)else echo\%%~i&& echo\^}
)
:: Checking lines_1-9 :: Checking file contents/lines on screen
title <nul & title Checking file contents/lines on screen
timeout /t 10 | type .\post.json & endlocal
- Auf meinem Computer erhalte ich die Ausgabe:
{
"os" : "Microsoft Windows 10 Home Single Language",
"osVersion" : "10.0.19043",
"username" : "DESKTOP-JRRL1K6\DP",
"brand" : "LENOVO",
"model" : "80UH",
"ram" : "20",
"storage" : "447",
"macAddress" : "5C:C9:D3:7E:B1:1C",
"processor" : "Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz"
}
Antwort2
Wie Sie getan haben set var=%%
, ist die Variable definiert – sie ist einfach leer.
So prüfen Sie, ob eine Variable leer ist:
IF [%1] == [] ...
IF "%~1" == "" ...
Weitere Informationen finden Sie im Beitrag Wie kann man richtig testen, ob ein Parameter in einer Batchdatei leer ist?