中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-22 11:11
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请问如果在文本中抽取指定字符赋值于变量中 查看 5,746 回复 32
楼 主 请问如果在文本中抽取指定字符赋值于变量中 发表于 2006-12-12 06:06 ·  中国 广东 深圳 电信
初级用户
积分 43
发帖 14
注册 2006-12-09 06:08
19年会员
UID 73009
性别 男
状态 离线
我想,在一个文本文件中,抽取第17行第8-20这一串字符,并将它们赋值于一个变量给接下来的命令用,怎么办?

请各位大侠不要怪我整天问这些太菜的问题,我也觉得有点不好意思。想到不耻下问,这坛子的确令我学到东西,所以就壮胆了。

[ Last edited by namejm on 2006-12-13 at 01:54 PM ]
2 发表于 2006-12-12 06:12 ·  中国 河南 郑州 电信
中级用户
★★
积分 439
发帖 170
注册 2006-01-09 20:29
20年会员
UID 48707
状态 离线

setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt ) do (
set /a num+=1
if !num! equ 17 set var=%%i
if !num! equ 17 set var=!var:~7,13!
)
echo !var!
pause
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
ccwan +5 2006-12-12 06:23
bat c c++
3 发表于 2006-12-12 06:19 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
19年会员
UID 68504
性别 男
来自 湖南==》广东
状态 离线

@echo off
for /f "skip=16 delims=" %%i in (test.txt) do (
set "str=%%i"
call set "str=%%str:~7,12%%"
goto :exit)
:exit
echo %str%
pause>nul

或者:


@echo off
for /f "delims=: tokens=1,2*" %%i in ('findstr /n . test.txt') do (
if %%i EQU 17 (
set "str=%%j"
call set "str=%%str:~7,12%%"
goto :exit))
:exit
echo %str%
pause>nul



[ Last edited by youxi01 on 2006-12-12 at 06:22 AM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
ccwan +5 2006-12-12 06:24
4 发表于 2006-12-12 06:21 ·  中国 江苏 苏州 联通
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
19年会员
UID 60484
状态 离线
setlocal enabledelayedexpansion
for /f "skip=16 delims=" %%i in (filename.txt) do (
set var=%%i
set var=!var:~7,13!
goto :outfor)
:outfor

红色部分你可以自己随便替换。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
ccwan +5 2006-12-12 06:24
5 发表于 2006-12-12 06:22 ·  中国 江苏 苏州 联通
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
19年会员
UID 60484
状态 离线
哇,我手脚太慢了。 = =b
6 发表于 2006-12-12 06:24 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
我的手够快吧?
鼓励一下热心的朋友们!
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
7 发表于 2006-12-12 06:53 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
还有,楼主注意你的标题!
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
8 发表于 2006-12-12 07:08 ·  中国 广东 深圳 电信
初级用户
积分 43
发帖 14
注册 2006-12-09 06:08
19年会员
UID 73009
性别 男
状态 离线
谢谢热心的朋友们,我以后会注意标题了。
9 发表于 2006-12-12 09:07 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
Re all:

  用批处理来提取文本内容,要随时注意兼容特殊字符,比如空格,比如连接字符&、||等,因此,youxi01 兄在3F的代码动用了 delims= 和 set "str=%%i" ,这是非常有必要的。

  不过,批处理还是不能处理所有的特殊情况,比如:如果有以半角分号开头的行,一般的 for 语句会忽略这些行,用 set /a num+=1 来统计行数会出错,换成 for + findstr /n 就可以避免;但是,for + findstr /n 也不能包打天下,至少,如果某些行以半角冒号打头,则 for /f "tokens=1* delims=:" %%i in ('findstr /n .* test.txt') do echo "%%j" 会把所有行首冒号忽略掉。所以,在处理文本的时候,只能指望这些特殊的情形不一起出现了。不知各位有没有什么好办法来解决。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
10 发表于 2006-12-12 10:25 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
@echo off
setlocal enabledelayedexpansion
set num=
for /f "delims=" %%i in ('findstr .* a.txt') do (
set /a num += 1
set "!num!=%%i"
)
for /l %%i in (1,1,%num%) do echo 第%%i行: !%%i!
pause

暂时的变更方案,试试有无bug。
11 发表于 2006-12-12 11:04 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  3742668 兄10F的代码仍然不能正确处理行首为分号的情况,也不能正确处理行内带感叹号的情况。

  代码1能正确处理行首为分号或冒号,行上带&、||等特殊字符的文本,但是不能正确提取带感叹号的内容,代码2能解决感叹号的问题,但是需要用引号括起来,基本上解决了我在9F提出的问题,请各位测试:

  代码1:

@echo off
set num=0
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('findstr /n .* test.txt') do (
set /a num+=1
set "str=%%i"
echo 第 !num! 行: !str:*:=!
)
pause

  代码2:

@echo off
set num=0
::setlocal enabledelayedexpansion
for /f "delims=" %%i in ('findstr /n .* test.txt') do (
set /a num+=1
set "str=%%i"
call :display
)
pause
goto :eof

:display
echo 第 %num% 行: "%str:*:=%"
goto :eof

  test.txt的内容:

:abc
::xy
;
;;;ef &
;:;
::;;
||
&
^
!<
!
%
"
""
'


[ Last edited by namejm on 2006-12-11 at 10:13 PM ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
12 发表于 2006-12-12 11:41 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
try try this:
@echo off
setlocal enabledelayedexpansion
set num=
for /f "eol= delims=" %%i in ('findstr .* a.txt') do (
setlocal DISABLEDELAYEDEXPANSION
set "tmpstr=%%i"
setlocal enabledelayedexpansion
set /a num += 1
set "!num!=!tmpstr!"
)
for /l %%i in (1,1,%num%) do echo 第%%i行: !%%i!
pause
exit /b 0
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
lxmxn +5 2006-12-12 13:47
13 发表于 2006-12-12 12:18 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  eol= 用得巧,setlocal 用得妙,高,实在是高,嘿嘿。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
14 发表于 2006-12-12 13:47 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线

  真是强啊。学习了。。
15 发表于 2006-12-12 13:50 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线

  还有一个问题,就是如果a.txt里面有空行(直接回车)的话,那么就会出错,批处理提示:

已经达到最大的 setlocal 递归层。

  不知道这个问题怎么解决?
论坛跳转: