[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
由于楼主的研究精神,于是乎截取文本头几行,或截取文本指定行的问题迎刃而解!
赞一个
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 mxxcgzxxx 于 2011-7-20 22:36 编辑
@echo off
setlocal enabledelayedexpansion
(
    for /l %%a in (1 1 10) do (
        pause >nul
        set /p echo=
        echo !echo!
    )
)
tmplinshi 发表于 2011-7-18 10:36


有趣的结果:起头的()被忽略,最后一个P被上一行吃了
所以用这种办法还得小心
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 mxxcgzxxx 于 2011-7-18 11:11 编辑

9# tmplinshi
哦,是啊,没注意,pause吃了后面的输入!
也就是说<%0被分成了两下,第一个字被pause吃了,剩下的才轮到set/p,
可以用作去头几个字符用了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::从每行第三个字符截取
  4. (
  5.     for /l %%a in (1 1 10) do (
  6.         for /l %%1 in (1 1 3) do pause >nul
  7.         set /p echo=
  8.         echo %%a !echo!
  9.         )
  10. ) <%0
  11. pause
复制代码
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

下面这个测试很有趣。空行被吃一个字符后,理应是换行符被吃,但造成换行符加下一行的(被吸上来了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (
  4.     for /l %%a in (1 1 10) do (
  5.         pause>nul
  6.         set /p echo%%a=
  7.         echo %%a !echo%%a!
  8.         )
  9. ) <%0
  10. pause
复制代码
1

评分人数

世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 mxxcgzxxx 于 2011-7-18 13:40 编辑

13# tmplinshi

学习,之前没想过这个问题哈,是要省点空间
我都是用抓屏键,用图画工具弄的,换成PNG反面有50多KB
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 mxxcgzxxx 于 2011-7-19 08:45 编辑

从特殊字符方面来说还是有很大区别的
  1. !@#~#$%^&*()_+-={}|":?><;'\`"~!@#$%^&*()_+|":?><
复制代码
用SET/P和FOR/F分别读取并输出
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (
  4.     for /l %%a in (1 1 1) do (
  5.         set/p echo=
  6.         echo.!echo!
  7.         )
  8. ) <1.txt >2.txt
  9. for /f "delims=" %%1 in (1.txt) do (
  10.        set "str=%%1"
  11.        echo !str!
  12.        )>>2.txt
复制代码
结果
  1. !@#~#$%^&*()_+-={}|":?><;'\`"~!@#$%^&*()_+|":?><
  2. ?><;'\`"~?><
复制代码
说明,如果在有特殊字符的情况下,SET/P更加合理而简便
1

评分人数

世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 mxxcgzxxx 于 2011-7-19 09:39 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (
  4.        set/p a=
  5.        set/p b=
  6.        set/p c=
  7.        echo.!a!
  8.        echo.!b!
  9.        echo.!c!
  10.        )<1.txt >2.txt
复制代码
这样子是一次性获取头三行信息,
利用这个可进行隔行获取
  1. @echo off
  2. (
  3.      for /l %%1 in (1 1 10 ) do (
  4.        setlocal enabledelayedexpansion
  5.        set/p 偶数行=
  6.        set/p 奇数行=
  7.        echo.!偶数行!>>2.txt
  8.        echo.!奇数行!>>3.txt
  9.        endlocal
  10.        )
  11. )<1.txt
复制代码
测试了多种组全发现,SET/P可以全文吸收一个字符都不错,
但无法跳过空行是一个优点也是一大问题
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 mxxcgzxxx 于 2011-7-19 15:49 编辑

21# zm900612
听起来是这个理,但下面这个情况怎么解释呢?
  1. @echo off
  2. (for /l %%a in (1 1 10) do (
  3. pause>nul
  4. rem 用两个pause测试,看究竟是否吞了两组 0D 0A,如果 pause 是吞整个 0D 0A,那结果应该不会出现空行或者带换行符的变量
  5. set /p .%%a=))<%0
  6. set.>1.txt
  7. pause
复制代码
输出的1.txt为
.1=echo off
.4=for /l %%a in (1 1 10) do (
.5=ause>nul
.6=em 用两个pause测试,看究竟是否吞了两组 0D 0A,如果 pause 是吞整个 0D 0A,那结果应该不会出现空行或者带换行符的变量
.7=et /p .%%a=))<%0
.8=et.>1.txt
.9=ause

按理应该是下面这样取值的啊,为什么到3行出错了?然道说第三行的 0D 0A 可以用两次
@echo off 0D 0A
0D 0A
0D 0A
0D 0A
(for /l %%a in (1 1 10) do ( 0D 0A
pause>nul0D 0A
rem 用两个pause测试,看究竟是否吞了两组 0D 0A,如果 pause 是吞整个 0D 0A,那结果应该不会出现空行或者带换行符的变量0D 0A
set /p .%%a=))<%0 0D 0A
set.>1.txt 0D 0A
pause 0D 0A

.1=echo off
.2=0A 0D 0A
.3=0A
for /l %%a in (1 1 10) do (
.4=ause>nul
...
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

有半个换行符的值写入文本后会出现一个像退格符的黑块,但我发不上论坛,
可以对TXT文本进行复制并写到批处理里面,很好用也
但无法通过变量截取的方式获得有点可惜!
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 mxxcgzxxx 于 2011-7-19 17:05 编辑

24# zm900612


那可以这样理解吗? 0D 0A 和0A 0D 都可以起到结束SET/P的输入过程
三行空行时
0D 0A
0D 0A
0D 0A
第一个0D被吃  SET/P得到0A 0D (强行终结)
第二个0A被吃   SET/P得到0D 0A (完整)
这样还能解释为什么三个空行被赋值两次
0A 0D 的组合有没有代表什么?
5个空行情况:
吃 ---- 留
0D---0A| 0D
0A|---0D  0A|
0D---0A| 0D
0A|---文本,所以正常不换行

以此类推,基本都合理了
1空行:0A 换行文本
2空行:完整文本
3空行:文本少头一字符
4空行:0A 换行文本
5空行:完整文本
。。。三个空行一个循环,所以:
1,4,7,10。。。为换行文本
2,5,8,11。。。为不少字的完整文本
0,3,6,9。。。为少头一字符的文本

刚才测试了下,完全符合这个规律!
1

评分人数

    • zm900612: 妙!很有可能如此PB + 5 技术 + 1
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 mxxcgzxxx 于 2011-7-21 16:50 编辑

用提取的换行符玩下,虽然不知实用性在哪方面可以应用?
因为论坛会吃单空格行,所以我使用:号
  1. :
  2. @echo off
  3. ::获取0A换行符
  4. (pause>nul&set /p a=)<%0
  5. echo 你好%a%我在哪?
  6. pause>nul
复制代码
由于半个换行让“我在哪?”进行了无间道,不存在的东西
但开了变量延时后就不一样了
  1. :
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. ::获取0A换行符
  5. (set/p=&pause>nul&set /p a=)<%0
  6. echo 你好!!a!我在哪啊?!a!你也不知道吗?!a!真是可惜……
  7. pause>nul
  8. set "b=123!a!456!a!789"
  9. echo !b!
  10. pause>nul
复制代码
效果不是太理想但也很好了,一次三行内容,就是后面的每行多一个符号,可以加个退格符就可以了!!
而且可以通过赋值传达给别的函数,但一定要开变量延时和加上一个退格符!

我也搜索了论坛,应该来说这个方法是快而简便获取换行符的方法,
又一个新技术诞生了哈!
  1. :
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. ::获取0A换行符
  5. (pause>nul&set /p a=)<%0
  6. ::通过赋值用退格符将换行符后的空格修整得到完整实用的换行符
  7. set "b=!a!"
  8. echo !b!123456!b!789
  9. pause>nul
复制代码
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

返回列表