[ 新手习题 6 ] 批处理添加汉字行号
a.txt[code]要怎么学好批处理?可潜水看帖,静静研究;
可看教程做习题,然后解决实际的问题;
也可二者并用取其优,当然还有其他方法。
你是怎么做的呢?[/code]以上文本有五行,要求显示如下:(行号可为大写,但必须是汉字)[code]一┃要怎么学好批处理?
二┃可潜水看帖,静静研究;
三┃可看教程做习题,然后解决实际的问题;
四┃也可二者并用取其优,当然还有其他方法。
五┃你是怎么做的呢?[/code]方法不限。答对加分鼓励,第一个最多。
[quote]
上一题:[ 新手练习 5 ] 随机显示星期几
[url=http://bbs.bathome.net/thread-2564-1-1.html]http://bbs.bathome.net/thread-2564-1-1.html[/url]
下一题:[ 新手练习 7 ] 把所有输出都写入一个文件
[url=http://bbs.bathome.net/thread-2582-1-1.html]http://bbs.bathome.net/thread-2582-1-1.html[/url]
[/quote]
[[i] 本帖最后由 wxcute 于 2008-11-18 21:04 编辑 [/i]]
我不知道是不是这样啊。
[code]@echo off@echo 一┃要怎么学好批处理?
@echo 二┃可潜水看帖,静静研究;
@echo 三┃可看教程做习题,然后解决实际的问题;
@echo 四┃也可二者并用取其优,当然还有其他方法。
@echo 五┃你是怎么做的呢
pause[/code]
回复 2楼 的帖子
小心我扣你分 ^_^ 。代码括起来也用错了,应该是 code是要通过批处理读取 a.txt 文件。
[[i] 本帖最后由 wxcute 于 2008-11-17 11:08 编辑 [/i]] a.txt中内容是固定的、总在10行之内?还是未知多少行呢? 看错了,|和┃不一样啊!
粗的┃情况:[code]@echo off&setlocal enabledelayedexpansion
set "head=一二三四五"
set /a num=0
for /f %%i in (a.txt) do (
call echo %%head:~!num!,1%%┃%%i
set /a num+=1
)
pause[/code]"或"字符|:[code]@echo off&setlocal enabledelayedexpansion
set "head=一二三四五"
set /a num=0
for /f %%i in (a.txt) do (
call set /p=%%head:~!num!,1%%<nul
set /p=^|%%i<nul
echo.
set /a num+=1
)
pause>nul[/code]
[[i] 本帖最后由 lhjoanna 于 2008-11-17 20:39 编辑 [/i]]
回复 4楼 的帖子
总在 10 行之内吧,暂不考虑过多行数的。 [code]@echo offset "var="
setlocal enabledelayedexpansion
for %%i in (一 二 三 四 五) do (
set /a var+=1
set ,!var!=%%i
)
set "var="
for /f "eol= delims=" %%a in (a.txt) do (
call :sub %%a
)
pause>nul
exit
:sub
set /a var+=1
echo !,%var%!┃%1
goto :eof[/code]
[[i] 本帖最后由 mingming1205 于 2008-11-17 16:31 编辑 [/i]]
回复 6楼 的帖子
是,如果未知多少行,不知要难多少倍了。 适用于1-99行的:[code]@echo off&setlocal enabledelayedexpansionset "str=一 二 三 四 五 六 七 八 九 十"
for %%i in (%str%) do set /a n+=1&set "_!n!=%%i"
for /f "tokens=1* delims=:" %%i in ('findstr /n .* a.txt') do (
set "a=%%i"
if "!a:~1!" equ "" (
echo !_%%i!行 %%j
) else (
call,echo %%_!a:~,1!%%十%%_!a:~1!%%行 %%j
)
)
pause>nul[/code]
同理可写适于1-999行,1-9999行,1-9.........9行,只要再设置个变量set "var=十 百 千 万...." [code]@echo off&SETLOCAL ENABLEDELAYEDEXPANSION&set "code=一 二 三 四 五"&set a=
goto :main
:head
set str=%1
set /a a+=1
for /f "tokens=%a% delims= " %%b in ("%code%") do (
set str%a%=!str:%a%=%%b!
set str%a%=!str%a%::=┃!)
goto :eof
:main
for /f "delims=" %%a in ('findstr/n . a.txt') do (call :head %%a)
for /l %%b in (1 1 5) do (echo. !str%%b!)
pause[/code]不知道合要求不? 跟batman的速度比较还是比较差...
batman
20:42:17.31 20:42:17.35
小弟
20:43:02.04 20:43:02.09 1-99999行的:[code]@echo off&setlocal enabledelayedexpansion
set "str=一 二 三 四 五 六 七 八 九"&set "var=万千百十零"
for %%i in (%str%) do set /a n+=1&set "_!n!=%%i"
for /f "tokens=1* delims=:" %%i in ('findstr /n .* a.txt') do (
set "a=%%i"&call :lp
call,set "b=%%var:~-!m!%%"&set "m=0"
set "a=%%i"
call :loop %%i "%%j"
)
pause>nul&goto :eof
:lp
set "a=%a:~1%"&set /a m+=1
if defined a goto lp
goto :eof
:loop
if %1 lss 10 (
call,set "string=%string%零%%_!a:~,1!%%"
) else (
if %a:~,1% equ 0 (
set "string=%string%零"
) else (
if "%b:~,1%" neq "零" (
call,set "string=%string%%%_!a:~,1!%%%b:~,1%"
) else (
call,set "string=%string%%%_!a:~,1!%%"
)
)
)
set "b=%b:~1%"&set "a=%a:~1%"
if defined a goto loop
set "string=%string:零零零=零%"
set "string=%string:零零=零%"
if "%string:~-1%" equ "零" set "string=%string:~,-1%
set "string=%string%行 "
echo %string:~,9% %~2&set "string="[/code]测试文本a.txt由下面的代码生成[code]@echo off
for /l %%i in (1,1,99999) do echo %%i>>a.txt[/code] 真的是如此,查找了原因,原来是在call中出的问题,当%%j中含有空格时要用双引号引
起,并在后面输出时将引号去掉:call :loop %%i "%%j" echo %string:~,9% %~2
ps:兄弟不用给我加分,呵呵。
回复 12楼 的帖子
你那个代码害的我差点死机了。使用的时候把99999改成999就很多了 [code]@echo off&setlocal enabledelayedexpansion
call :111 一 二 三 四 五
pause>nul&goto :eof
:111
for /f %%i in (a.txt) do (
set /a num+=1
call echo %%!num!┃%%i
)
goto :eof[/code]
[[i] 本帖最后由 skuny 于 2009-1-14 20:05 编辑 [/i]]
回复 2楼 的帖子---call echo 好东西 学习了
@echo offset tt=一二三四五
set /a t=0
for /f %%i in (ff.txt) do (
call set rr=%%tt:~!t!,1%%
set /a t+=1
call echo %%rr%%!%%i
)
echo --call echo 开启延迟环境变量---
echo ok
echo --call echo-实现环境变量的嵌套----
echo ---从而可以在for语句中-使数据指针-%%tt%%-动态的变化---
echo --不知道我的理解有没有错误-----
for %%i in (0 1 2) do (
set uu=%%i
call echo %%uu%%
)
----------我对call echo的认识-----------------------------------------
1---call的标准用法
例子1:
call :a
goto:eof
:a
:echo 123
例子2:
call :a 123
goto:eof
:a
echo %1
把例子1,2合并,写成一种非标形式:
例子1------>call echo 123----回显123
例子2----->call echo %1---如果保存文件为nn.bat,输入nn 123 ,则回显123
例子3-----call echo %%i ---回显 i---说明脱掉了2个%号,call和echo个脱掉一个
所以 call echo 实际是调用子程序的简写,这样就很容易解释,call有延迟环境变量的功能,但是它并没有
开启延迟环境变量。只是调用了子程序的结果。
2-----call在for中的实例
for %%i in (0 1 2) do (
set t=%%i
echo %t%
)
由于bat是解释执行的,最后就只显示---->2
再看:
call :a
goto:eof
:a
set t=123
for %%i in (0 1 2) do (
set t=%%i
echo %t%
)
回显---》123 123 123,这是因为cmd执行的是解释程序。
改一改
call:a %t%
goto:eof
:a
set t=123
for %%i in (0 1 2) do (
set t=%%i
echo %1
)
这时call 调用子程序的参数,,回显----》2 2 2
上一句call调用的是for执行前的结果,这句调用的是for执行后的结果
由此,的结论:要调用for执行后的结果,应该调用子程序的参数。
再改一改上一句
@echo off
set t=123
for %%i in (0 1 2) do (
set t=%%i
call:a
:a
echo %t%
)
此时显示----》0 123 1 123 2 123这句说明了call可以让数据指针在for语句执行中,跟着for一起舞动,但是for执行完之后,它又回复到了
初始状态。call的这个功能相当于延迟环境变量的功能,但是它没有开启延迟环境变量,我以前的认识是错误的。
因为延迟变量传递值的时间比call早。这句话没法控制数据指针%t%返回到 t=123,无论你把goto:eof加到那里都不行。这是因为call这个支点会把前面的数据推入堆栈,call后就会自动把原来的数据从堆栈里面弹出,这样我们就看到了0 123 1 123 2 123这种数据的舞蹈。遗憾的是bat没有控制堆栈的语句。经过无数人的研究,发现了一种病态的写法来解决这个问题。
再改一改:
@echo off
set t=123
for %%i in (0 1 2) do (
set t=%%i
call echo %%t%%
)
此时回显-----》0 1 2
原因如下:因为call执行的原理是把它前面的结果先推入堆栈,然后进入分支点,把分支点的内容执行完后,就从堆栈里面弹出保存的数据,然后回到call的下一个支点,继续前进。
上面语句虽然是病态的,但是那个多加的%号,刚好然call麻醉了。多的那个%号,call认为,它推入堆栈的数据应该是从for开始的数据,for每循环一次的数据 ,call都把它推入堆栈,call执行完子程序后(就是这个病态写法里面的echo %%t%%),就会从堆栈里面弹出数据,然后执行它的下一句,就是进入for的下一次循环。 call语句中数据指针%t%始终指向的是存储单元t ,for每次循环的值都是放在t存储单元的。从而就动态的看到了t值的变话。方法虽病态,这也是没办法的办法,随叫微软不弄个管理堆栈的命令。延迟环境变量利用的应该也是堆栈技术。setlocal enabledelayedexpansion这句话,就是把前面的数据推入到堆栈。endlocal 就是把推入堆栈的数据弹出来。%t% ,!t! 为数据指针,指向的是存储单元t,所以 call推入堆栈的数据是for的数据。发明这个方法的人,该的诺贝尔奖。呵呵
[[i] 本帖最后由 myzwd 于 2009-3-1 15:03 编辑 [/i]] [quote]原帖由 [i]lhjoanna[/i] 于 2008-11-17 15:06 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=15465&ptid=2569][img]http://www.bathome.net/images/common/back.gif[/img][/url]
看错了,|和┃不一样啊!
粗的┃情况:@echo off&setlocal enabledelayedexpansion
set "head=一二三四五"
set /a num=0
for /f %%i in (a.txt) do (
call echo %%head:~!num!,1%%┃%%i
set /a num+=1 ... [/quote]
非常不明白CALL此时的用意,想了两天都没有得到合理的答案,没有它又不行!哎~~
不知道是不是在执行每一行之后暂停,接下去再执行!求求各位大大讲解!!
回复 17楼 的帖子
教学区搜索“变量延迟扩展”教学区搜索“变量嵌套” 自己研究的,但是不能去掉双引号!郁闷!
是 | ,不是┃。[code]@echo off
setlocal enabledelayedexpansion
set hh=一二三四五
set n=0
for /f %%k in (a.txt) do (
call set v=%%hh:~!n!,1%%
echo "!v! | %%k"
set /a n+=1
)
pause[/code] 我来帮楼上的修改下(看来你的测试文本只有5行):[code]@echo off&setlocal enabledelayedexpansion
set "hh=一二三四五"&set /a n=0
for /f "delims=" %%k in (a.txt) do (
call,echo %%hh:~!n!,1%% %%k
set /a n+=1
)
pause>nul[/code] @echo off
setlocal enabledelayedexpansion
set rowNO=0
del temp.txt
for /F %%i in (a.txt) do (
set /A rowNOTemp= !rowNO! + 1 & (
set rowNO= !rowNOTemp! & (
echo 当前行号为:!rowNO! ) & (
if /i "!rowNOTemp!" EQU "1" (
echo 一┃ : %%i >>temp.txt
) else (
if /i "!rowNOTemp!" EQU "2" (
echo 二┃: %%i >>temp.txt
) else (
if /i "!rowNOTemp!" EQU "3" (
echo 三┃: %%i >>temp.txt
) else (
if /i "!rowNOTemp!" EQU "4" (
echo 四┃: %%i >>temp.txt
) else (
echo 五┃: %%i >>temp.txt
))))
)
)
)
del a.txt
ren temp.txt a.txt
pause [code]@echo off
set str=一二三四五
setlocal enabledelayedexpansion
for /f %%i in (test2.txt) do (
set a=!str:~0,1!
echo !a! ^|%%i
set str=!str:~1! )
pause[/code]
[[i] 本帖最后由 cainiao736 于 2009-3-26 22:00 编辑 [/i]]
回复 20楼 的帖子
batman兄的改动,更加规范,简洁,但是没有了符号 “|”我在batman 兄的改动下,再次改动,去掉了双引号。[code]@echo off&setlocal enabledelayedexpansion
set "hh=一二三四五"&set n=0
for /f %%k in (a.txt) do (
call set "c=%%hh:~!n!,1%% | %%k"
echo !c!
set /a n+=1
)
pause>nul[/code] 若测试文本只有5行
:[code]@echo off&setlocal enabledelayedexpansion
set "hh=一二三四五"
for /f "delims=" %%k in (a.txt) do (
echo !hh:~0,1! ^| %%k
set "hh=!hh:~1!"
)
pause>nul[/code]
回复 24楼 的帖子
呵呵,还是随风兄牛逼,我被自己弄蒙了。我想问一下,"delims=" 这个分隔符是什么? 不写这个"delims=" 行不行?
回复 25楼 的帖子
tokens=*和delims=的区别是什么?[url]http://bbs.bathome.net/viewthread.php?tid=1654#pid8870[/url]
回复 15楼 的帖子
请问: call echo %%!num!┃%%i!num!的前面为什么要加两个%%呢?不是用call调用时用%1,%2……表示吗??
回复 27楼 的帖子
参考:批处理中的变量延迟扩展、变量嵌套[url]http://bbs.bathome.net/viewthread.php?tid=2899[/url] @echo off
setlocal enabledelayedexpansion
set /a var=0
set list=一二三四五
for /f %%i in (a.txt) do (
call echo %%list:~!var!,1%%┃%%i
set /a var+=1
)
pause>nul
%0 [code]@echo off
setlocal enabledelayedexpansion
set "number=一二三四五"
for /f "tokens=*" %%a in (a.txt) do (
set no=!number:~0,1!
echo !no!^|%%a
set number=!number:~1!
)
echo 按任意键退出!
pause>nul[/code]
页:
[1]
2