[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理设置文本内容为变量

本帖最后由 mnokoko 于 2024-11-2 21:41 编辑

已知文本 config.ini 内容规律如下:

[LIST]
Rows=N

[Information_0]
Item=RAaa
Software=C:\\RUN\\a.exe
Result=C:\\RUN\\result.log

[Information_1]
Item=RB
Software=C:\\RUN\\b.exe
Result=C:\\GOODWAY\\RUN\\NetTest_DIY\\result.log

[Information_2]
Item=Net
Software=C:\\RUN\\c.exe
Result=C:\\GOODWAY\\RUN\\NetTest_DIY\\result.log

[Information_3]
这里共有N个类似格式的内容.......

欲求效果如下,设置变量:

Item0=RA
Software0=C:\RUN\A.exe
Item1=RB
Software1=C:\RUN\B.exe
Item2=NET
Software2=C:\RUN\c.exe

我尝试用"行数"来做逻辑,但是写的一塌糊涂,请问这该如何实现

===============================================================
问题已解决,如下:

@echo off &setlocal enabledelayedexpansion
for /f "tokens=1-4 delims=[=]" %%a in (
   'findstr /i /b "[Information_ item= software=" "menuA.ini" ') do (
       call :infor %%a %%b
      )
endlocal&pause>nul&exit/b

:infor
set variable=%1
echo %variable%| findstr /i "Information" > nul &&CALL :set %1 %2 || call :notequ %1 %2
goto :eof

:SET
set num=%1
set "n=!num:~-1!"
GOTO :EOF

:notequ
set "a=%1"
set "b=%2"
set "b=!b:\\=\!"
echo.%1!n!="!b!"
goto :eof
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 10# hfxiang


   看不懂,完全看不懂,

TOP

回复 9# qixiaobin0715


   感谢作答,学习了

TOP

回复 10# hfxiang


    感谢作答

TOP

回复 8# 77七


   太多套娃的命令我看不懂
   一行一个的我能懂

TOP

回复 1# mnokoko

此类文本处理问题,可在命令行窗口下尝试用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )来实现:
  1. gawk "/Information_/{split($0,s,/[_\[\]]+/);a=s[3]}/^Item=/||/^Software/{gsub(\"\\\\\\\\\\\\\\\\\",\"\\\\\");split($0,s,/=/,m);print s[1] a m[1] s[2]}" config.ini>out.ini
复制代码

TOP

本帖最后由 qixiaobin0715 于 2024-10-28 09:04 编辑
  1. @echo off
  2. set n=0
  3. setlocal enabledelayedexpansion
  4. for /f "tokens=1* delims==" %%a in ('findstr "Item= Software="') do (
  5.     if "%%a"=="Item" (
  6.         set Item!n!=%%b
  7.         set /a n+=1
  8.     ) else (
  9. set "str=%%b"
  10. set "str=!str:\\=\!"
  11.         set Software!n!=!str!
  12.     )
  13. )
  14. set Item
  15. set Software
  16. pause
复制代码
1

评分人数

TOP

回复 7# mnokoko


   为什么要搞得如此复杂?
bat小白,请多指教!谢谢!

TOP

  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "tokens=1-4 delims=[=]" %%a in (
  3.    'findstr /i /b "[Information_ item= software=" "menuA.ini" ') do (
  4.        call :infor %%a %%b
  5.       )
  6. endlocal&pause>nul&exit/b
  7. :infor
  8. set variable=%1
  9. echo %variable%| findstr /i "Information" > nul &&CALL :set %1 %2 || call :notequ %1 %2
  10. goto :eof
  11. :SET
  12. set num=%1
  13. set "n=!num:~-1!"
  14. GOTO :EOF
  15. :notequ
  16. set "a=%1"
  17. set "b=%2"
  18. set "b=!b:\\=\!"
  19. echo.%1!n!="!b!"
  20. goto :eof
复制代码

TOP

按行数 ,行数从1开始 ,空行也算1行
编码全部ansi
  1. @echo off
  2. for /f "delims=" %%a in ('findstr /n .* "config.ini "') do (
  3. set "hang=%%a"
  4. set /a hangshu+=1
  5. setlocal enabledelayedexpansion
  6. set hang=!hang:*:=!
  7. if !hangshu! == 5 (
  8. for %%h in ("!hang!") do endlocal&set "@hang05=%%~h"
  9. )
  10. if !hangshu! == 6 (
  11. for %%h in ("!hang!") do endlocal&set "@hang06=%%~h"
  12. )
  13. if !hangshu! == 10 (
  14. for %%h in ("!hang!") do endlocal&set "@hang10=%%~h"
  15. )
  16. if !hangshu! == 11 (
  17. for %%h in ("!hang!") do endlocal&set "@hang11=%%~h"
  18. )
  19. if !hangshu! == 15 (
  20. for %%h in ("!hang!") do endlocal&set "@hang15=%%~h"
  21. )
  22. if !hangshu! == 16 (
  23. for %%h in ("!hang!") do endlocal&set "@hang16=%%~h"
  24. )
  25. if "!nil!" == "%nil%" endlocal
  26. )
  27. set @hang
  28. pause&exit/b
复制代码

TOP

  1. @echo off
  2. cd /d "%~dp0"
  3. set n=-1
  4. for /f "tokens=1* delims==" %%a in ('findstr /i "^item ^software" "config.ini"') do (
  5. if /i "%%a" equ "item" (
  6. set /a n+=1
  7. call set %%a%%n%%=%%b
  8. ) else if /i "%%a" equ "software" (
  9. call set %%a%%n%%=%%~fb
  10. )
  11. )
  12. echo 0-%n%
  13. pause
复制代码
1

评分人数

bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-10-26 18:02 编辑

回复 3# mnokoko

代码第3行用findstr.exe析取config.ini文件中仅包含目标数据项的所有行
代码第4行读到包含字段为‘information’的数据行时提取对应序号
代码第5行读到包含字段为‘item’或‘softeware’的数据行时设置变量 #item* 或 #software*,并替换其中的\\为\
代码第7行屏显所有包含#前缀的新建变量

TOP

回复 2# aloha20200628


    能讲解下这什么意思吗?正在学习代码,对这些套娃的命令有点看不懂,另外提示环境变量#未定义,这该怎么处理,谢谢大佬

TOP

本帖最后由 aloha20200628 于 2024-10-26 17:39 编辑

回复 1# mnokoko

新建变量名前缀#字符作为变量名统一标识以便于提取...
  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=[_=]" %%a in (
  3.    'findstr /ib "[information_ item= software=" "config.ini" ') do (
  4.    if /i "%%a"=="information" (set "n=%%b") else (
  5.       set "b=%%b" &set "b=!b:\\=\!" &set "#%%a!n!=!b!")
  6. )
  7. set #
  8. endlocal&pause&exit/b
复制代码
1

评分人数

TOP

返回列表