
@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
다음 형식의 정보가 포함된 hardware.txt 파일을 읽는 for 루프를 만들었습니다.
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
다음 형식으로 json을 얻습니다.
{
"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" ,
}
두 번째 for 루프에서는 else 조건이 실행되지 않습니다. 다른 쉬운 방법이 있다면 알려주세요. 아니면 누구든지 저에게 도움을 줄 수 있다면 좋을 것입니다. json에 숫자가 필요하기 때문에 변수가 숫자인지 확인하고 싶기 때문에 두 번째 for 루프가 필요합니다. 또한 적절한 json을 만들기 위해 문자열 뒤의 마지막 쉼표를 제거하는 방법도 모르겠습니다.
답변1
@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
나는 다음을 고려하고 있다:
For /F
루프 명령이 를 사용하고 있으므로 hardware.txt 파일의 첫 번째 줄을 건너뛰어야 하므로 루프skip=1
는 notFor /L
에서 시작하므로 파일의 줄/변수도 "건너뛰었습니다".2
1
하드웨어 파일에 있는 대부분의 문자열은 내가 명령처럼 사용
wmic
하고 파일로 리디렉션되었다고 가정하는 스크립트에 의해 가져왔고 결과적으로 줄 끝의 추가 공백이 줄 끝에 추가되는 곳입니다/ 끈.나는 이해하지 못했습니다 (제한된 영어 실패). 숫자를 식별하기 위해 원하는/필요한 곳에서 무엇을 해야 하는지, 추가 설명이 이 시점에서 당신을 만날 수 있도록 답변을 조정할 수도 있습니다.
이미 귀하의 명령이 를 사용하여 획득되었다고 가정하고
wmic
첫 번째 줄이나 그 원점에서 어떤 내용을 이동할지 모르더라도 hardware.txt 파일과 유사한 정보를 얻는 또 다른 박쥐를 추가하고 이미 리디렉션하고 있습니다. .json 파일 형식의 출력안건4.확실히 당신의 질문의 해당 부분에 대답하지 않습니다다른 쉬운 방법 있으면 알려주세요, 죄송합니다. 향후 편집/개작 시 처리를 용이하게 하기 위해 다시 수행하고 싶은 몇 가지 작업이 있습니다.
find "="
첫 번째 루프에서 사용할 때For /F
"="가 있는 줄을 세고 질문에 게시된 hardware.txt와 동일한 파일을 고려/사용하므로 동일한 줄과 각각의 양으로 테스트하는 것이 좋습니다. 질문에 게시된 내용에 차이점이 있으면 알려주시기 바랍니다.항목에 표시된 용도라고 생각합니다.6.쓸모없거나 비생산적 일 수 있으므로
skip=1
아래에 전체 코드와 줄 끝에 추가 공백 없이 문자열을 가져오는 제안 코드를 추가합니다.
skip=1
in 루프가 없는 경우For
:
:: 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\^});=
- 문자열을
.json
형식으로 가져오고 줄 끝에 추가 공백이 없습니다.
@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
- 내 컴퓨터에서는 다음과 같은 결과를 얻습니다.
{
"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"
}
답변2
완료한 대로 set var=%%
변수가 정의되었습니다. 이는 단지 비어 있습니다.
빈 변수를 확인하려면:
IF [%1] == [] ...
IF "%~1" == "" ...
자세한 내용은 포스팅을 참조하세요 배치 파일에서 매개변수가 비어 있는지 테스트하는 적절한 방법은 무엇입니까?