找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28826|回复: 5

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

[复制链接]
发表于 2018-9-6 14:06:20 | 显示全部楼层 |阅读模式
我向系统里面注册了一个协议叫做 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了半天也没找到解决办法.
尝试过转义也不行.
取出来的值永远是 "&" 符号之前的字符.
还有密码中会多出一个 "/" , 很是神奇...
请教大神这是什么原因呢?有没有什么处理的办法呢?
发表于 2018-9-6 14:31:10 | 显示全部楼层
delims=$_$ 不是以字符串 $_$ 作为分隔符,而是以字符 $ 和 _ 作为分隔符
建议换成单个字符作为分隔符

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

&是特殊字符,作为参数的一部分进行传递的时候需要加引号:
service.cmd "cat://linux&192.168.1.10&root&123456&22"
 楼主| 发表于 2018-9-6 15:56:27 | 显示全部楼层
delims=$_$ 不是以字符串 $_$ 作为分隔符,而是以字符 $ 和 _ 作为分隔符
建议换成单个字符作为分隔符

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



感谢 , 我改一下分隔符试试看.
 楼主| 发表于 2018-9-7 15:17:32 | 显示全部楼层
回复 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. 密码的内容不正确 , 多了一个 "/" , 有点无法理解了...
发表于 2018-9-7 15:50:21 | 显示全部楼层
回复 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
复制代码
 楼主| 发表于 2018-9-7 15:57:17 | 显示全部楼层
回复 5# Batcher


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

再次感谢~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 18:28 , Processed in 0.018093 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表