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

[文本处理] 请教一个批处理特殊字符的问题

我向系统里面注册了一个协议叫做 cat , 会向 service.cmd 中传递参数.
传递的内容类似于 cat://linux&_&192.168.1.10&_&root&_&123456&_&22
其中 &_& 是分隔符.

service.cmd 中部分代码如下:
  1. for /f "delims=>$_$ tokens=1" %%i in (%1) do (set type=%%i)
  2. for /f "delims=>$_$ tokens=2" %%j in (%1) do (set ip=%%j)
  3. for /f "delims=>$_$ tokens=3" %%k in (%1) do (set username=%%k)
  4. for /f "delims=>$_$ tokens=4" %%l in (%1) do (set password=%%l)
  5. for /f "delims=>$_$ tokens=5" %%m in (%1) do (set port=%%m)
复制代码
大部分情况都蛮正常的可以用 , 但是如果密码中包含了特殊字符 , 例如 "&" 这种字符 , 就歇菜了.
Google了半天也没找到解决办法.
尝试过转义也不行.
取出来的值永远是 "&" 符号之前的字符.
还有密码中会多出一个 "/" , 很是神奇...
请教大神这是什么原因呢?有没有什么处理的办法呢?

delims=$_$ 不是以字符串 $_$ 作为分隔符,而是以字符 $ 和 _ 作为分隔符
建议换成单个字符作为分隔符

另外,建议养成好习惯,tokens在前,delims在后,避免遇到自己无法理解的现象。

&是特殊字符,作为参数的一部分进行传递的时候需要加引号:
service.cmd "cat://linux&192.168.1.10&root&123456&22"
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

delims=$_$ 不是以字符串 $_$ 作为分隔符,而是以字符 $ 和 _ 作为分隔符
建议换成单个字符作为分隔符

...
Batcher 发表于 2018-9-6 14:31



感谢 , 我改一下分隔符试试看.

TOP

回复 2# Batcher

管理员您好 , 不好意思又来请教您了:
这是 service.cmd 的部分代码 , 还在调试.
  1. for /f "tokens=1 delims=>_" %%i in (%1) do (set type=%%i)
  2. for /f "tokens=2 delims=>_" %%j in (%1) do (set ip=%%j)
  3. for /f "tokens=3 delims=>_" %%k in (%1) do (set username=%%k)
  4. for /f "tokens=4 delims=>_" %%l in (%1) do (set pass=%%l)
  5. for /f "tokens=5 delims=>_" %%m in (%1) do (set port=%%m)
  6. echo %1
  7. echo %type:~6,3%
  8. echo %ip%
  9. echo %username%
  10. echo %pass%
  11. echo %port:~0,-1%
  12. pause
复制代码
打印出来的结果 , 为

有几个不太明白的地方.
1. 打印 %1 的结果是带双引号的 , 应该已经是字符串类型了 , 为啥 & 还是执行了呢...
2. 密码的内容不正确 , 多了一个 "/" , 有点无法理解了...

TOP

回复 4# kenshin912



因为密码里面的&是特殊字符,echo的时候也要加上引号。
  1. @echo off
  2. for /f "tokens=1 delims=_" %%i in (%1) do (set "type=%%i")
  3. for /f "tokens=2 delims=_" %%j in (%1) do (set "ip=%%j")
  4. for /f "tokens=3 delims=_" %%k in (%1) do (set "username=%%k")
  5. for /f "tokens=4 delims=_" %%l in (%1) do (set "pass=%%l")
  6. for /f "tokens=5 delims=_" %%m in (%1) do (set "port=%%m")
  7. echo %1
  8. echo %type:~6,3%
  9. echo %ip%
  10. echo %username%
  11. echo "%pass%"
  12. echo %port:~0,-1%
  13. pause
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 5# Batcher


万分感谢 , 明白了 , 即使是打印出来的时候也要带上双引号 .

再次感谢~

TOP

返回列表