[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理命令set /p =<1.txt获取字符串为何出错?

1.txt内容:
文字:sadasd wqwe 2

批处理代码:
  1. @echo off
  2. for /f "tokens=2 delims=:" %%a in ('findstr "文字" 1.txt') do echo %%a>>t1.txt
  3. setlocal enabledelayedexpansion
  4. set /p a=<t1.txt
  5. echo %a%>t2.txt
复制代码
但是生成的t2.txt是空的,t1.txt没问题。
经过测试发现,只要t1.txt第一行结尾是空格+1位数字,上面的问题就会出现。

请给位帮忙解决,多谢

预处理时,如果 > 前紧贴着未转义的数字,则会认为是用户所指定的句柄
可改成:
  1. echo>t2.txt %a%
复制代码
或:
  1. setlocal enabledelayedexpansion
  2. echo !a!>t2.txt
复制代码

TOP

先感谢版主这么快就帮我解决了问题

本人半路出家学批处理,未转义的数字 是什么意思?

版主能解释一下吗?

为何其他情况下我用同样的命令(文本不同)就没问题?

TOP

回复 3# wnsdt


    批处理中的转义是指通过 转义符^ 或 使用双引号"" 使 cmd 在解读命令的过程中将具有特殊意义的特殊字符看作普通字符的过程,例:
  1. echo abc&echo def
  2. ::未转义的连接符 & 将发挥“断句”作用,使前后的内容成为两条命令
  3. echo abc^&echo def
  4. ::转义后的 & 失去连接符的功效,于是 cmd 认为此处只有一条命令
复制代码
具体到楼主的问题,做个对比试验:
  1. echo 1>con
  2. ::cmd 的划分为:  [echo ][1>con]
  3. echo ^1>con
  4. ::cmd 的划分为:  [echo 1][>con]
复制代码
数字 1 并不是特殊字符,这里的 1 转义前后的结果之所以会有区别,是因为 cmd 在解析语法时,前一条命令中的 1 被认为是句柄重定向的一部分,即 1>con,而 echo 命令参数为空。而后一条语句中,cmd 所解读的句柄重定向语句为  >con,数字 1 则是 echo 的参数...

说白了就是使用含有歧义的命令使 cmd 以错误的方式解读,转义并非最好的办法,一般通过两种途径解决:
1、将重定向符号 > 与数字分离,比如将 echo 1>con 写成 echo>con 1 或 >con echo 1
2、使用 延迟变量!var! 或 for里的参数变量%%a 来代替 %var% 及 %1 这种形式的变量或参数,以避免由于 cmd 先解释变量再解析语法所产生的各种问题。

TOP

真感谢版主这么耐心仔细的回答,还有个问题一直困扰我
  1. set /p 变量1=输入:
  2. 判断输入1
  3. set /p 变量2=输入:
  4. 判断输入2
复制代码
如果判断2发现输入错误,需要再次输入,可是屏幕上会多一行”set /p 变量2=输入:"
如何实现,在保留变量1的输入结果前提下,不显示多出来的”set /p 变量2=输入:"这一行?

TOP

回复 5# wnsdt


    建议给出具体代码~

TOP

  1. @echo off
  2. :sc1
  3. cls
  4. set "name="
  5. set /p name= 输入 名称:
  6. if not defined name goto sc1
  7. echo.&echo.
  8. :sc2
  9. set "age="
  10. set /p age= 输入 年龄:
  11. if not defined age goto sc2
复制代码
代码的原意是每次输入进行判断,错了就重新输入,但是目前发现年龄一旦错误,会反复显示“输入 年龄:”,肯定不能再用cls。

请问如何在屏幕保留姓名输入结果的前提下,如果年龄输入错误,重新输入不会反复显示

TOP

cmd只有全局清屏cls
所以有两种方法
[1]只靠批处理
思路:先cls,再用echo输出
  1. @echo off
  2. set /p a=input:
  3. :a
  4. cls
  5. echo input:%a%
  6. set /p b=input:
  7. if "%b%"=="" echo 输入为空!&goto a
复制代码
[2]用第三方工具
你可以用def兄的Cext,下载后运行演示工具,每一个屏幕暂停都看看,有一个删除文本的.
  1. @echo off
  2. set /p a=input:
  3. :a
  4. set /p b=input:
  5. if "%b%"=="" echo 输入为空!&cext /del 1&goto a
复制代码

TOP

回复 8# ht河豚


    纯批也可退行哦~
http://bbs.bathome.net/viewthread.php?tid=7137

TOP

返回列表