标题: [文本处理] 请教一个批处理特殊字符的问题 [打印本页]
作者: kenshin912 时间: 2018-9-6 14:06 标题: 请教一个批处理特殊字符的问题
我向系统里面注册了一个协议叫做 cat , 会向 service.cmd 中传递参数.
传递的内容类似于 cat://linux&_&192.168.1.10&_&root&_&123456&_&22
其中 &_& 是分隔符.
service.cmd 中部分代码如下:- for /f "delims=>$_$ tokens=1" %%i in (%1) do (set type=%%i)
- for /f "delims=>$_$ tokens=2" %%j in (%1) do (set ip=%%j)
- for /f "delims=>$_$ tokens=3" %%k in (%1) do (set username=%%k)
- for /f "delims=>$_$ tokens=4" %%l in (%1) do (set password=%%l)
- for /f "delims=>$_$ tokens=5" %%m in (%1) do (set port=%%m)
复制代码
大部分情况都蛮正常的可以用 , 但是如果密码中包含了特殊字符 , 例如 "&" 这种字符 , 就歇菜了.
Google了半天也没找到解决办法.
尝试过转义也不行.
取出来的值永远是 "&" 符号之前的字符.
还有密码中会多出一个 "/" , 很是神奇...
请教大神这是什么原因呢?有没有什么处理的办法呢?
作者: Batcher 时间: 2018-9-6 14:31
delims=$_$ 不是以字符串 $_$ 作为分隔符,而是以字符 $ 和 _ 作为分隔符
建议换成单个字符作为分隔符
另外,建议养成好习惯,tokens在前,delims在后,避免遇到自己无法理解的现象。
&是特殊字符,作为参数的一部分进行传递的时候需要加引号:
service.cmd "cat://linux&192.168.1.10&root&123456&22"
作者: kenshin912 时间: 2018-9-6 15:56
delims=$_$ 不是以字符串 $_$ 作为分隔符,而是以字符 $ 和 _ 作为分隔符
建议换成单个字符作为分隔符
...
Batcher 发表于 2018-9-6 14:31
感谢 , 我改一下分隔符试试看.
作者: kenshin912 时间: 2018-9-7 15:17
回复 2# Batcher
管理员您好 , 不好意思又来请教您了:
这是 service.cmd 的部分代码 , 还在调试.- for /f "tokens=1 delims=>_" %%i in (%1) do (set type=%%i)
- for /f "tokens=2 delims=>_" %%j in (%1) do (set ip=%%j)
- for /f "tokens=3 delims=>_" %%k in (%1) do (set username=%%k)
- for /f "tokens=4 delims=>_" %%l in (%1) do (set pass=%%l)
- for /f "tokens=5 delims=>_" %%m in (%1) do (set port=%%m)
-
- echo %1
- echo %type:~6,3%
- echo %ip%
- echo %username%
- echo %pass%
- echo %port:~0,-1%
- pause
复制代码
打印出来的结果 , 为
有几个不太明白的地方.
1. 打印 %1 的结果是带双引号的 , 应该已经是字符串类型了 , 为啥 & 还是执行了呢...
2. 密码的内容不正确 , 多了一个 "/" , 有点无法理解了...
作者: Batcher 时间: 2018-9-7 15:50
回复 4# kenshin912
因为密码里面的&是特殊字符,echo的时候也要加上引号。- @echo off
- for /f "tokens=1 delims=_" %%i in (%1) do (set "type=%%i")
- for /f "tokens=2 delims=_" %%j in (%1) do (set "ip=%%j")
- for /f "tokens=3 delims=_" %%k in (%1) do (set "username=%%k")
- for /f "tokens=4 delims=_" %%l in (%1) do (set "pass=%%l")
- for /f "tokens=5 delims=_" %%m in (%1) do (set "port=%%m")
-
- echo %1
- echo %type:~6,3%
- echo %ip%
- echo %username%
- echo "%pass%"
- echo %port:~0,-1%
- pause
复制代码
作者: kenshin912 时间: 2018-9-7 15:57
回复 5# Batcher
万分感谢 , 明白了 , 即使是打印出来的时候也要带上双引号 .
再次感谢~
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |