AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1738175
Accepted
Gaurav Sahane
Gaurav Sahane
Asked: 2022-08-22 05:33:56 +0800 CST2022-08-22 05:33:56 +0800 CST 2022-08-22 05:33:56 +0800 CST

使用批处理脚本将文本文件转换为 json 文件

  • 772
@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

我做了一个 for 循环,它从名为 hardware.txt 的文件中读取,该文件具有以下格式的信息:

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 条件。如果还有其他简单的方法,请告诉我,或者如果有人可以帮助我,那就太好了。我需要第二个 for 循环,因为我想检查变量是否是数字,因为我需要 json 中的数字。我也不知道如何删除字符串后的最后一个逗号以制作正确的 json。

batch json
  • 2 2 个回答
  • 283 Views

2 个回答

  • Voted
  1. harrymc
    2022-08-22T05:52:28+08:002022-08-22T05:52:28+08:00

    正如您所做set var=%%的那样,变量已定义 - 它只是空的。

    检查空变量:

    IF [%1] == [] ...
    IF "%~1" == "" ...
    

    有关更多信息,请参阅帖子 什么是测试批处理文件中的参数是否为空的正确方法?

    • 0
  2. Best Answer
    Io-oI
    2022-08-23T16:16:41+08:002022-08-23T16:16:41+08:00
    @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
    

    我正在考虑:

    1. 您需要跳过 hardware.txt 文件的第一行,因为您的For /F循环命令正在使用skip=1,因此For /L 循环从2not开始1 ,因此也“跳过”了文件的一行/变量。

    2. 硬件文件中的大多数字符串都是由脚本获取的,我假设我像wmic命令一样使用并重定向到文件,因此,这就是在行尾添加额外空格的地方/细绳。

    3. 我不明白(我英语有限),你需要在你想要/需要识别数字的地方做什么,任何额外的解释也可能会调整答案以满足你的需求。

    4. 即使我已经假设您的命令是通过使用获得的wmic,也不知道在第一行跳转什么内容或其来源,我正在添加另一个 bat,它获取类似于您的 hardware.txt 文件的信息,但是已经重定向.json 文件格式的输出

    5. 项目4.绝对不能回答你问题的那部分如果有任何其他简单的方法请告诉我,原谅我,有些事情我更喜欢重新做以方便在未来的编辑/改编中处理

    6. find "="在第一个循环中使用时For /F,我正在计算具有“=”的行,并考虑/使用与您的问题中发布的 hardware.txt 相等的文件,因此我建议您使用相同的行和相应的数量进行测试问题中发布的行,如果有差异,请告诉我...

    7. 我想第6项中指出的用途可能会skip=1 过时/无效,所以我在下面添加了一个完整的代码以及建议代码来获取字符串,而在行尾没有额外的空格......


    • 没有skip=1inFor循环:
    :: 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"
    }
    

    在此处输入图像描述

    • 0

相关问题

  • 从命令行计算具有特定扩展名 (.mp4) 的文件夹和子文件夹中的文件

  • Windows批处理文件最小化所有打开的窗口

  • Windows 批处理更改所有 IIS 应用程序池超时

  • 命令行:文件重命名的通用命令

  • Python 的“pass”参数的批处理等价物是什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve