标题: [文本处理] [已解决]批处理设置文本内容为变量 [打印本页]
作者: mnokoko 时间: 2024-10-26 14:55 标题: [已解决]批处理设置文本内容为变量
本帖最后由 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
作者: aloha20200628 时间: 2024-10-26 15:59
本帖最后由 aloha20200628 于 2024-10-26 17:39 编辑
回复 1# mnokoko
新建变量名前缀#字符作为变量名统一标识以便于提取...
- @echo off &setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=[_=]" %%a in (
- 'findstr /ib "[information_ item= software=" "config.ini" ') do (
- if /i "%%a"=="information" (set "n=%%b") else (
- set "b=%%b" &set "b=!b:\\=\!" &set "#%%a!n!=!b!")
- )
- set #
- endlocal&pause&exit/b
复制代码
作者: mnokoko 时间: 2024-10-26 16:51
回复 2# aloha20200628
能讲解下这什么意思吗?正在学习代码,对这些套娃的命令有点看不懂,另外提示环境变量#未定义,这该怎么处理,谢谢大佬
作者: aloha20200628 时间: 2024-10-26 17:56
本帖最后由 aloha20200628 于 2024-10-26 18:02 编辑
回复 3# mnokoko
代码第3行用findstr.exe析取config.ini文件中仅包含目标数据项的所有行
代码第4行读到包含字段为‘information’的数据行时提取对应序号
代码第5行读到包含字段为‘item’或‘softeware’的数据行时设置变量 #item* 或 #software*,并替换其中的\\为\
代码第7行屏显所有包含#前缀的新建变量
作者: 77七 时间: 2024-10-27 11:27
- @echo off
- cd /d "%~dp0"
- set n=-1
- for /f "tokens=1* delims==" %%a in ('findstr /i "^item ^software" "config.ini"') do (
- if /i "%%a" equ "item" (
- set /a n+=1
- call set %%a%%n%%=%%b
- ) else if /i "%%a" equ "software" (
- call set %%a%%n%%=%%~fb
- )
- )
- echo 0-%n%
- pause
复制代码
作者: Five66 时间: 2024-10-27 14:29
按行数 ,行数从1开始 ,空行也算1行
编码全部ansi- @echo off
- for /f "delims=" %%a in ('findstr /n .* "config.ini "') do (
- set "hang=%%a"
- set /a hangshu+=1
- setlocal enabledelayedexpansion
- set hang=!hang:*:=!
-
- if !hangshu! == 5 (
- for %%h in ("!hang!") do endlocal&set "@hang05=%%~h"
- )
-
- if !hangshu! == 6 (
- for %%h in ("!hang!") do endlocal&set "@hang06=%%~h"
- )
-
- if !hangshu! == 10 (
- for %%h in ("!hang!") do endlocal&set "@hang10=%%~h"
- )
-
- if !hangshu! == 11 (
- for %%h in ("!hang!") do endlocal&set "@hang11=%%~h"
- )
-
- if !hangshu! == 15 (
- for %%h in ("!hang!") do endlocal&set "@hang15=%%~h"
- )
-
- if !hangshu! == 16 (
- for %%h in ("!hang!") do endlocal&set "@hang16=%%~h"
- )
-
- if "!nil!" == "%nil%" endlocal
- )
-
- set @hang
- pause&exit/b
复制代码
作者: mnokoko 时间: 2024-10-27 23:22
- @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
复制代码
作者: 77七 时间: 2024-10-28 00:08
回复 7# mnokoko
为什么要搞得如此复杂?
作者: qixiaobin0715 时间: 2024-10-28 08:59
本帖最后由 qixiaobin0715 于 2024-10-28 09:04 编辑
- @echo off
- set n=0
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims==" %%a in ('findstr "Item= Software="') do (
- if "%%a"=="Item" (
- set Item!n!=%%b
- set /a n+=1
- ) else (
- set "str=%%b"
- set "str=!str:\\=\!"
- set Software!n!=!str!
- )
- )
- set Item
- set Software
- pause
复制代码
作者: hfxiang 时间: 2024-10-28 10:17
回复 1# mnokoko
此类文本处理问题,可在命令行窗口下尝试用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )来实现:- 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
复制代码
作者: mnokoko 时间: 2024-10-29 16:27
回复 8# 77七
太多套娃的命令我看不懂
一行一个的我能懂
作者: mnokoko 时间: 2024-11-2 21:29
回复 10# hfxiang
感谢作答
作者: mnokoko 时间: 2024-11-2 21:34
回复 9# qixiaobin0715
感谢作答,学习了
作者: mnokoko 时间: 2024-11-2 21:59
回复 10# hfxiang
看不懂,完全看不懂,
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |