标题: [文本处理] [已解决] 批处理命令echo显示时如何忽略连接符? [打印本页]
作者: pZjVa0 时间: 2013-7-10 21:41 标题: [已解决] 批处理命令echo显示时如何忽略连接符?
本帖最后由 pZjVa0 于 2013-7-13 17:20 编辑
- @echo off
- set /p text=请输入内容:
- echo %text%
- pause
复制代码
以上代码中,text的内容为不确定性
在不添加""(双引号) 的情况下,如何可以做到即使用户输入了带&(连接符)等特殊符号的情况下也可以正常显示出来
作者: Demon 时间: 2013-7-10 21:51
变量延迟拓展
作者: 悬崖之树 时间: 2013-7-10 22:05
- set a=abc^^^&qdj
- echo %a%
- pause
复制代码
作者: pZjVa0 时间: 2013-7-11 09:50
回复 3# 悬崖之树
显示内容为不确定性。
作者: pZjVa0 时间: 2013-7-11 09:50
回复 2# Demon
除了变量延迟之外呢?
作者: CrLf 时间: 2013-7-11 18:56
变量延迟方案:- setlocal enabledelayedexpansion
- echo !text!
- endlocal
复制代码
虽然不明白变量延迟有什么不便,但也可以这样- 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 编辑
- setlocal enabledelayedexpansion
- echo !text!
- endlocal
复制代码
是可以把text变量的内容原样输出,但是给text赋值就比较麻烦,如:
set text=abc^&ssm
不能做到输入什么就显示什么。
作者: 522235677 时间: 2013-7-11 21:45
回复 6# CrLf
现在才知道用延迟变量可以达到这样。
如果%1有特殊符号要怎么写呢?
作者: CrLf 时间: 2013-7-12 03:05
回复 8# 522235677 复制代码
作者: 522235677 时间: 2013-7-12 22:49
回复 9# CrLf - 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
处理过程添加双引号,显示的时候不显示双引号- @echo off
- set /p text=请输入内容:
- set /p in="%text%"<nul
- echo,
- 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
最后请教一个,上面代码有办法可以用这种形式输出吗?复制代码
在结果前面增加一段文字
作者: pZjVa0 时间: 2013-7-13 16:11
回复 13# 523066680 - @echo off
- set /p text=请输入内容:
- set /p in="你输入的内容是:"<nul
- set /p in="%text%"<nul
- echo,
- pause
复制代码
我试了一下,把代码改成这样后可以变成我想要的效果,不知道这样写是不是最好的方法呢?
作者: 523066680 时间: 2013-7-13 16:49
回复 523066680 我试了一下,把代码改成这样后可以变成我想要的效果,不知道这样写是不是最好的方法呢?
pZjVa0 发表于 2013-7-13 16:11
施主醒目。
作者: terse 时间: 2013-7-13 18:28
仅显示吗- @echo off
- set /p text=请输入内容:
- for /f "delims=" %%i in ("%text%") do echo 你输入的内容是:%%~i
- 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里面出错,并且成功显示容易特殊字符- @echo off
- :AA
- cls
- set "jjdd=~!@#¥%……&*()《》<>{}[]_+-|\?/"
- set /p jjdd=请输入字符(包含任意特殊字符):
- for /f "delims=" %%a in ("%jjdd%") do echo. %%a
- pause&GOTO AA
复制代码
请测试:
作者: CrLf 时间: 2013-7-19 00:04
回复 25# wskwfkbdn
不光是单数引号会出错,双数引号也存在这种情况:- for /f "delims=" %%a in ("&"&"&") do echo. %%a
复制代码
作者: terse 时间: 2013-7-19 00:25
看来变量延迟应付了- @echo off
- :AA
- cls
- set "jjdd=~!@#¥%……&*()《》<>{}[]_+-|\?/"
- set /p jjdd=请输入字符(包含任意特殊字符):
- cmd /v /c echo !jjdd!
- pause&GOTO AA
复制代码
作者: wskwfkbdn 时间: 2013-7-19 16:02
回复 26# CrLf
是滴,
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |