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

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

[复制链接]
发表于 2024-2-2 20:47:29 | 显示全部楼层 |阅读模式
假设批处理文件名是x.bat 我想给它传递一个文件夹的路径, 如果文件夹名字中或路径中有^ 符号, 就会被删除, 需要用两个^^才行, 例如下面这个, 类似的情况还有哪些字符需要注意? 有好的解决方案吗
x.bat "C:\Users\Administrator\Desktop\TEST^"

x.bat的内容
  1. @echo off
  2. echo %~1
复制代码
发表于 2024-2-2 22:21:11 | 显示全部楼层
英文百分号(%):存在对应变量时进行拓展,例如%os%.txt(%os%.bat甚至可能不能直接双运行)
英文逗号(,)英文等号(=)英文分号(;):不能直接拖到bat上,可能会被截断
解决办法不知道
 楼主| 发表于 2024-2-3 10:53:19 | 显示全部楼层
回复 2# Five66


    多谢大佬提醒, 这坑真是多
发表于 2024-2-3 19:33:28 | 显示全部楼层
拖放是个臭毛病,尽可能的远离。
发表于 2024-2-3 20:20:52 | 显示全部楼层
回复 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技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2024-2-4 15:56:53 | 显示全部楼层
本帖最后由 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 06:09 , Processed in 0.019193 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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