Board logo

标题: [文本处理] [已解决]批处理中输入的字符串中含有特殊字符时无法正常运行 [打印本页]

作者: summerflower    时间: 2010-3-2 18:19     标题: [已解决]批处理中输入的字符串中含有特殊字符时无法正常运行

  1. @echo off
  2. set /p str=请输入:
  3. echo %str%
复制代码
如果我的输入中有特殊字符,哪怕只对这个字符串做最简单的处理echo,都会出错,要么提示命令语法不正确,要么说不是内部命令或外部命令

[ 本帖最后由 summerflower 于 2010-3-5 23:02 编辑 ]
作者: zcydez    时间: 2010-3-2 18:23

比如abc&def
则程序会显示:
abc
'def' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
这是当然的啦
作者: BatCoder    时间: 2010-3-2 19:28

  1. @echo off
  2. set /p "str=请输入:"
  3. echo/%str%
复制代码

作者: renmingwu    时间: 2010-3-3 09:23

  1. @echo off
  2. set /p str=请输入:
  3. echo "%str%"
复制代码
输出时加上双引号就行了吧!
作者: summerflower    时间: 2010-3-3 10:39

回renmingwu:为什么要加上双引号?我的输出中不需要双引号啊

再说,你认为加上双引号就万无一失了吗?

你运行一下这条语句:echo "~!@#$%^&*()_+|-=\[];'.,/{}:"<>?"",这些特殊符号用双引号括起来了吧?可还是会报错
作者: batman    时间: 2010-3-5 08:33

  1. @echo off&setlocal enabledelayedexpansion
  2. set /p str=请输入:
  3. echo !str!
  4. pause>nul
复制代码

作者: cjiabing    时间: 2010-3-5 12:47

请输入:"<
系统找不到指定的路径。
作者: BatCoder    时间: 2010-3-5 17:48

你用6楼的代码,输入一个on试试?
作者: inittab    时间: 2010-3-5 19:36

echo !str! 改为echo;!str! 就行了
作者: 523066680    时间: 2010-3-5 19:46

如果linux shell下面的read可以移过来会很爽,
可以N秒内读取,
可以指定读取N个字符,
可以指定某个字符为结束输入标志……
作者: summerflower    时间: 2010-3-5 23:01

高手好多啊,o(≧v≦)o~~好棒
作者: renmingwu    时间: 2010-3-8 10:00

还是要学习呀!
置顶贴里面有个FOR的讲解,里面有关于变量扩展的说法。
在这里,我们先来充下电,看看“变量扩展”有是怎么一回事。
  用CN-DOS里批处理达人willsort的原话,那就是:“在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion)”,这其实是一个第一方的概念,是从命令解释器的角度进行称谓的,而从我们使用者的角度来看,则可以将它看作是引用(Reference)、调用(Call)或者获取(Get)。”(见:什么情况下该使用变量延迟?http://www.cn-dos.net/forum/viewthread.php?tid=20733)说得直白一点,所谓的“变量扩展”,实际上就是很简单的这么一件事情:用具体的值去替换被引用的变量及紧贴在它左右的那对百分号。

既然只要延迟变量的扩展行为,就可以获得我们想要的结果,那么,具体的做法又是怎样的呢?
  一般说来,延迟变量的扩展行为,可以有如下选择:
  1、在适当位置使用 setlocal enabledelayedexpansion 语句;
  2、在适当的位置使用 call 语句。
  使用 setlocal enabledelayedexpansion 语句,那么,[code19]和[code20]可以分别修改为:
@echo off
setlocal enabledelayedexpansion
set num=0&&echo !num!
pause
@echo off
set num=0
setlocal enabledelayedexpansion
for /f %%i in ('dir /a-d /b *.exe') do (
    set /a num+=1
    echo num 当前的值是 !num!
)
echo 当前目录下共有 %num% 个exe文件
dir /a-d /b *.txt|findstr "test">nul&&(
    echo 存在含有 test 字符串的文本本件
)||echo 不存在含有 test 字符串的文本文件
if exist test.ini (
    echo 存在 test.ini 文件
) else 不存在 test.ini 文件
pause
  使用第call语句,那么,[code19]和[code20]可以分别修改为:
@echo off
set num=0&&call echo %%num%%
pause
@echo off
set num=0
for /f %%i in ('dir /a-d /b *.exe') do (
    set /a num+=1
    call echo num 当前的值是 %%num%%
)
echo 当前目录下共有 %num% 个exe文件
dir /a-d /b *.txt|findstr "test">nul&&(
    echo 存在含有 test 字符串的文本本件
)||echo 不存在含有 test 字符串的文本文件
if exist test.ini (
    echo 存在 test.ini 文件
) else 不存在 test.ini 文件
pause
  由此可见,如果使用 setlocal enabledelayedexpansion 语句来延迟变量,就要把原本使用百分号对闭合的变量引用改为使用感叹号对来闭合;如果使用call语句,就要在原来命令的前部加上 call 命令,并把变量引用的单层百分号对改为双层。 其中,因为call语句使用的是双层百分号对,容易使人犯迷糊,所以用得较少,常用的是使用 setlocal enabledelayedexpansion 语句(set是设置的意思,local是本地的意思,enable是能够的意思,delayed是延迟的意思,expansion是扩展的意思,合起来,就是:让变量成为局部变量,并延迟它的扩展行为)。
  通过上面的分析,我们可以知道:
  1、为什么要使用变量延迟?因为要让复合语句内部的变量实时感知到变量值的变化。
  2、在哪些场合需要使用变量延迟语句?在复合语句内部,如果某个变量的值发生了改变,并且改变后的值需要在复合语句内部的其他地方被用到,那么,就需要使用变量延迟语句。而复合语句有:for语句、if……else语句、用连接符&、||和&&连接的语句、用管道符号|连接的语句,以及用括号括起来的、由多条语句组合而成的语句块。最常见的场合,则是for语句和if……else语句。
  3、怎样使用变量延迟?
  方法有两种:
  ① 使用 setlocal enabledelayedexpansion 语句:在获取变化的变量值语句之前使用setlocal enabledelayedexpansion,并把原本使用百分号对闭合的变量引用改为使用感叹号对来闭合;
  ② 使用 call 语句:在原来命令的前部加上 call 命令,并把变量引用的单层百分号对改为双层。

[ 本帖最后由 renmingwu 于 2010-3-8 10:25 编辑 ]




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2