标题: [文本处理] 批处理按段落输出 [打印本页]
作者: 523066680 时间: 2008-11-16 08:59 标题: 批处理按段落输出
文/hi.baidu.com/523066680
看了一些批处理蠕虫的代码,那一长串的echo, 和>> 和偶尔出现的转义字符^ ……感到无奈
以下是一个简单例子(并不体现优势),可以不用多次echo 将读取文本段落的部分代码作为涵数调用。
指定段落的开头和结尾的标志对应生成的文件名,当重定向多个段落和文件时,就可以用for 结合call 更体现优势
也只有在文本内容很多时 或者 分多个段落时 才能体现代码的优
- echo off
- call :setup test.bat
- exit
- :setup
- set "act="
- for /f "tokens=* eol=" %%a in (%~nx0) do (
- if "%%a"=="::%* end" (goto :eof)
- if defined act echo,%%a>>"%*"
- if "%%a"=="::%*" errcommand>"%*" 2>nul&set act=act
- )
- ::test.bat
- echo,%%!!
- pause
- ::test.bat end
复制代码
这个代码并不当做原创发表 我怕原创的东西不会得到普及。(说错了就请见谅)
而且应该很多人自己也做得出这个东西,我只是希望以后看到一些代码的时候 不会出现一长串的echo, >>
这样的体力活
也可以讨论讨论 这也许不是最好的方法 我只是开个头。
多段落分段重定向还有很多用途呢 比如说 可以把自己的作品全部放在一个批处理里面 就像打包一样。甚至可以设置由用户选择生成哪个批处理。
[ 本帖最后由 523066680 于 2008-11-22 16:16 编辑 ]
作者: 523066680 时间: 2008-11-16 09:15 标题: 下面是我对自己其中两个作品的例子
@echo off
call :setup sqr1-99.bat
call :setup RandDot.bat
exit
:setup
set "act="
for /f "tokens=* eol=" %%a in (%~nx0) do (
if "%%a"=="::%* end" (goto :eof)
if defined act echo,%%a>>"%*"
if "%%a"=="::%*" errcommand>"%*" 2>nul&set act=act
)
::RandDot.bat
@echo off
title made by hi.baidu.com/523066680
setlocal enabledelayedexpansion
mode con cols=60 lines=30
for /l %%a in (1,1,60) do (set space= !space!)
set /a line=14,col=29
:loop
set /a linenext=%random%%%30
set /a colnext=%random%%%60
for %%a in (line col) do (
if !%%a! lss !%%anext! (set %%aadd=+) else (set %%aadd=-)
)
:loop-1
if %line% neq %linenext% (
set /a line%lineadd%=1
) else (
set /a col%coladd%=1
)
cls
for /l %%a in (1,1,%line%) do echo,
echo,!space:~0,%col%!*
ping -n 1 127.1>nul
if %col% neq %colnext% (goto :loop-1)
goto :loop
::RandDot.bat end
::\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
::sqr1-99.bat
@echo off
rem 思路来自数学必修5 逐位计算,这一版本made by hi.baidu.com/523066680
:action
set /p input="(1-99):"
if "%input%"=="" goto :action
set /a a=0,n=0
:a
set /a a+=1,a1=0
:a1
set /a a1+=1,test=(n*10+a1)*(n*10+a1)
if %test% equ %input% (echo %a1% &goto :end)
if %test% lss %input% (goto :a1)
set /a n=n*10+a1-1,input*=100
if %a% lss 4 goto :a
echo %n:~0,1%.%n:~1%
pause>nul
:end
echo,&set input=
goto :action
::sqr1-99.bat end
[ 本帖最后由 523066680 于 2008-11-16 09:18 编辑 ]
作者: pusofalse 时间: 2008-11-16 09:21
小伙学理果真没错。加油!
作者: Batcher 时间: 2008-11-16 12:41
本版规则
1、求代码、寻求代码解释、探讨代码得失的帖子均可发在本版块,其余话题禁止在本版讨论;
2、求助时,务必在顶楼一次性把问题交代清楚;若文字难以表述,请配图说明,或是上传附件;但是,一切操作应从节约论坛资源的角度出发,能文字说明清楚的就无需再发图片,小图能说明问题的尽量不截全图,在不影响效果的前提下尽量压缩图片及附件;
3、所发代码若不止一行,请务必用code标记把代码部分首尾括起来,以便他人复制;
作者: 523066680 时间: 2008-11-22 15:57 标题: 回复 4楼 的帖子
下次一定 因为在网巴发的太紧张了……so ……
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |