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

[文件操作] 批处理怎样传递参数中的特殊字符?

假设批处理文件名是x.bat 我想给它传递一个文件夹的路径, 如果文件夹名字中或路径中有^ 符号, 就会被删除, 需要用两个^^才行, 例如下面这个, 类似的情况还有哪些字符需要注意? 有好的解决方案吗
x.bat "C:\Users\Administrator\Desktop\TEST^"

x.bat的内容
  1. @echo off
  2. echo %~1
复制代码

英文百分号(%):存在对应变量时进行拓展,例如%os%.txt(%os%.bat甚至可能不能直接双运行)
英文逗号(,)英文等号(=)英文分号(;):不能直接拖到bat上,可能会被截断
解决办法不知道

TOP

回复 2# Five66


    多谢大佬提醒, 这坑真是多

TOP

拖放是个臭毛病,尽可能的远离。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# Five66


     拖放运行bat文件实际上是执行
  1. C:\windows\system32\cmd.exe /c ""R:\x.bat" R:\a^b.txt"
复制代码
由于第一个引号和最后一个引号会被删除,所以 "R:\x.bat" R:\a^b.txt 中参数的分隔符(空白字符、逗号、分号、等号、NUL)和特殊字符^&|<>()不会被转义。
但有一种情况,当参数中含有空格时会被加上一对双引号
  1. C:\windows\system32\cmd.exe /c ""R:\x.bat" "R:\a  ^b.txt""
复制代码
空格和其他分隔符、特殊字符都会被双引号转义。
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

本帖最后由 aloha20200628 于 2024-2-4 15:58 编辑


记得多年前有个老帖关于此类问题做过长篇讨论,结果似乎是字符串包裹命令行参数和启用变量延迟会对其中的特殊字符产生较大影响。
所谓特殊字符是指数字和英文字母之外的键盘可见字符,当然也是在简中编码字符集的大前提之下。
用以下两行测试代码可实测出几种结果—即可在命令行参数中保全的特殊字符。仅供参考。
1.最坏情况:无双引号包裹命令行参数+启用变量延迟》@#$%_+-~`.}{[]('
2.次坏情况:有双引号包裹命令行参数+启用变量延迟》@#$%^&*( )_+=-~`/.,<>?|}{[]\';:
3.次好情况:有双引号包裹命令行参数+未用变量延迟》!@#$%*()_+-~`.}{[]?'
4.最好情况:无双引号包裹命令行参数+未用变量延迟》!@#$%^&*( )_+=-~`/.,<>?|}{[]\';:
将路径文件名拖至批处理脚本运行也可能导致上述四种情况,但因系统对路径文件名本身还有禁用字符(<|>/\:"?*),故可保全字符总量会相应减少。

验证1-2代码
  1. @echo off &if "%~1" neq "" (setlocal enabledelayedexpansion &echo,%1&endlocal&exit/b)
复制代码
验证3-4代码
  1. @echo off &if "%~1" neq "" echo,%1&exit/b
复制代码

TOP

返回列表