Board logo

标题: [文本处理] [已解决] 批处理命令echo显示时如何忽略连接符? [打印本页]

作者: pZjVa0    时间: 2013-7-10 21:41     标题: [已解决] 批处理命令echo显示时如何忽略连接符?

本帖最后由 pZjVa0 于 2013-7-13 17:20 编辑
  1. @echo off
  2. set /p text=请输入内容:
  3. echo %text%
  4. pause
复制代码
以上代码中,text的内容为不确定性

在不添加""(双引号) 的情况下,如何可以做到即使用户输入了带&(连接符)等特殊符号的情况下也可以正常显示出来
作者: Demon    时间: 2013-7-10 21:51

变量延迟拓展
作者: 悬崖之树    时间: 2013-7-10 22:05

  1. set a=abc^^^&qdj
  2. echo %a%
  3. pause
复制代码

作者: pZjVa0    时间: 2013-7-11 09:50

回复 3# 悬崖之树


    显示内容为不确定性。
作者: pZjVa0    时间: 2013-7-11 09:50

回复 2# Demon


    除了变量延迟之外呢?
作者: CrLf    时间: 2013-7-11 18:56

变量延迟方案:
  1. setlocal enabledelayedexpansion
  2. echo !text!
  3. endlocal
复制代码
虽然不明白变量延迟有什么不便,但也可以这样
  1. for /f "tokens=1* delims==" %%a in ('set text') do if %%a==text echo %%b
复制代码

作者: 悬崖之树    时间: 2013-7-11 21:44

本帖最后由 悬崖之树 于 2013-7-11 21:45 编辑
  1. setlocal enabledelayedexpansion
  2. echo !text!
  3. endlocal
复制代码
是可以把text变量的内容原样输出,但是给text赋值就比较麻烦,如:
set text=abc^&ssm
不能做到输入什么就显示什么。
作者: 522235677    时间: 2013-7-11 21:45

回复 6# CrLf


    现在才知道用延迟变量可以达到这样。

如果%1有特殊符号要怎么写呢?
作者: CrLf    时间: 2013-7-12 03:05

回复 8# 522235677
  1. set /p"=%~1"<nul&echo;
复制代码

作者: 522235677    时间: 2013-7-12 22:49

回复 9# CrLf
  1. C:\Users\Admin>"F:\新建 Windows 批处理文件 (3).bat" 1&1
复制代码
依然不行啊
作者: CrLf    时间: 2013-7-12 23:35

回复 10# 522235677


    这是 shell 的参数解析 bug,传递参数时不将程序中的特殊符号进行转义处理,是 ms 不负责任,自家孩子都不关照
作者: Demon    时间: 2013-7-13 08:55

回复  522235677


    这是 shell 的参数解析 bug,传递参数时不将程序中的特殊符号进行转义处理,是  ...
CrLf 发表于 2013-7-12 23:35


这个不是BUG,echo hello&world本来就应该解析为echo hello&world,Linux下的Shell也是如此。
作者: 523066680    时间: 2013-7-13 11:51

本帖最后由 523066680 于 2013-7-13 12:33 编辑

回复 1# pZjVa0


处理过程添加双引号,显示的时候不显示双引号
  1. @echo off
  2. set /p text=请输入内容:
  3. set /p in="%text%"<nul
  4. echo,
  5. pause
复制代码
请输入内容:C:\Users\Admin>"F:\新建 Windows 批处理文件 (3).bat" 1&1
C:\Users\Admin>"F:\新建 Windows 批处理文件 (3).bat" 1&1
请按任意键继续. . .


刚刚重新看帖才看到Crlf妞的写法。差不多吧
作者: pZjVa0    时间: 2013-7-13 15:50

回复 13# 523066680


    最后请教一个,上面代码有办法可以用这种形式输出吗?
  1. 请输入内容:
  2. 你输入的内容是:xxxx
复制代码
在结果前面增加一段文字
作者: pZjVa0    时间: 2013-7-13 16:11

回复 13# 523066680
  1. @echo off
  2. set /p text=请输入内容:
  3. set /p in="你输入的内容是:"<nul
  4. set /p in="%text%"<nul
  5. echo,
  6. pause
复制代码
我试了一下,把代码改成这样后可以变成我想要的效果,不知道这样写是不是最好的方法呢?
作者: 523066680    时间: 2013-7-13 16:49

回复  523066680 我试了一下,把代码改成这样后可以变成我想要的效果,不知道这样写是不是最好的方法呢?
pZjVa0 发表于 2013-7-13 16:11



    施主醒目。
作者: terse    时间: 2013-7-13 18:28

仅显示吗
  1. @echo off
  2. set /p text=请输入内容:
  3. for /f "delims=" %%i in ("%text%") do echo 你输入的内容是:%%~i
  4. pause
复制代码

作者: pZjVa0    时间: 2013-7-13 19:02

回复 17# terse


    测试有效。非常感谢
作者: wskwfkbdn    时间: 2013-7-15 22:53

本帖最后由 wskwfkbdn 于 2013-7-15 23:11 编辑

@echo off
set /p text=请输入内容:
for /f "delims=" %%i in ("%text%") do echo %%~i
pause


基本上能处理较多较复杂带特殊字符,如有bug请帮忙改进;原创注明:

bug 1:引号问题
输入字符: "123456""  p自动关闭
输入字符: "123456"   显示 123456 ,因为引号被%%~i 去掉了,
请输入内容: ""123456""   显示结果为 :   "123456" ,特殊字符视情况而改。
作者: pZjVa0    时间: 2013-7-16 14:27

回复 17# terse
作者: terse    时间: 2013-7-16 15:30

回复 20# pZjVa0
对引号的情况还是敏感的
作者: CrLf    时间: 2013-7-16 16:25

回复 19# wskwfkbdn


    让我想起以前讨论过的批处理密码验证 http://bbs.bathome.net/viewthread.php?tid=10980
    引用 %变量% 时如果要保证通用性,恐怕只有两种思路:
1、用变量延迟或者其他手段让变量在语法解释之后展开
2、用 "%变量:"=%" 或 "%变量:"=""%" 的方式引用变量中的字符串
作者: wskwfkbdn    时间: 2013-7-17 09:25

发现我的帖子和17楼一样,今天才注意到,
作者: wskwfkbdn    时间: 2013-7-17 09:44     标题: 标题

回复 22# CrLf
    特殊字符处理除了引号的bug,基本能显示和echo输出,回头想下解决方案,帖子我看了,有说到bat加密,特殊字符,那都是障眼法,对付非老手的可以OK
作者: wskwfkbdn    时间: 2013-7-18 22:54

回复 22# CrLf


    再度回顾老问题,现在来解释以下,我测试过了可以不用转义而能兼容任意字符,
  但是唯一的一个bug就是字符行尾不能是1个引号,3、5、7,......以此类推p运行就会有问题,如是双个引号,4、6个都不会再for里面出错,并且成功显示容易特殊字符
  1. @echo off
  2. :AA
  3. cls
  4. set "jjdd=~!@#¥%……&*()《》<>{}[]_+-|\?/"
  5. set /p jjdd=请输入字符(包含任意特殊字符):
  6. for /f "delims=" %%a in ("%jjdd%") do echo. %%a
  7. pause&GOTO AA
复制代码
请测试:
作者: CrLf    时间: 2013-7-19 00:04

回复 25# wskwfkbdn


    不光是单数引号会出错,双数引号也存在这种情况:
  1. for /f "delims=" %%a in ("&"&"&") do echo. %%a
复制代码

作者: terse    时间: 2013-7-19 00:25

看来变量延迟应付了
  1. @echo off
  2. :AA
  3. cls
  4. set "jjdd=~!@#¥%……&*()《》<>{}[]_+-|\?/"
  5. set /p jjdd=请输入字符(包含任意特殊字符):
  6. cmd /v /c echo !jjdd!
  7. pause&GOTO AA
复制代码

作者: wskwfkbdn    时间: 2013-7-19 16:02

回复 26# CrLf
    是滴,




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