Board logo

标题: [文件操作] 批处理怎样传递参数中的特殊字符? [打印本页]

作者: 小白龙    时间: 2024-2-2 20:47     标题: 批处理怎样传递参数中的特殊字符?

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

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

作者: Five66    时间: 2024-2-2 22:21

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

回复 2# Five66


    多谢大佬提醒, 这坑真是多
作者: Batcher    时间: 2024-2-3 19:33

拖放是个臭毛病,尽可能的远离。
作者: buyiyang    时间: 2024-2-3 20:20

回复 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""
复制代码
空格和其他分隔符、特殊字符都会被双引号转义。
作者: aloha20200628    时间: 2024-2-4 15:56

本帖最后由 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
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2