BAT 参数去引号(各种去引号的奇葩方式)
很多情况下,我们需要脱除一个字符串中可能会存在的引号,然后在加上自己的引号使其中的特殊字符(命令连接符&、|、&&、||,命令行参数界定符Space、tab、;、=,字符化转义符^、",变量化转义符%等)字符化,失去特定的作用,而作为普通的字符成为字符串的一个组成部分。
一、将字符串中的引号脱去的简单办法有三种,它们的功能相近,只是各自的使用场合不同,可以处理大多数的情况。
1-1、如果字符串存在于命令行参数%1中,可以使用%~1脱去第一对外侧引号,如果没有外侧引号则字符串不变;
1-2、如果字符串存在于for替代变量%%i中,可以使用%%~i脱去第一对外侧引号,如果没有外侧引号则字符串不变;
1-3、如果字符串存在于环境变量%temp%中,可以使用%temp:"=%脱去其中所有的引号,如果没有引号则字符串不变;
1-4、以上三种方案在某种程度上可以互相通用,因为它们作为变量的一种类型,可以通过类似以下的代码或代码片断相互转移:
1-4-1、for替代变量转命令行参数:call:DeQuote%%i 1-4-2、环境变量转命令行参数:call:DeQuote%temp% 1-4-3、命令行参数转for替代变量:for%%iin(%1)do... 1-4-4、环境变量转for替代变量:for%%iin(%temp%)do... 1-4-5、命令行参数转环境变量:settemp=%1 1-4-6、for替代变量转环境变量:for...settemp=%%i
二、如果字符串的引号分布情况很复杂,或者我们对被脱去引号的位置有特殊要求,或者字符串中可能出现某些控制字符,则可以将字符串首先通过1-4中的对应方法转存至环境变量中,在使用以下方案或其组合进行处理:
2-1、可以使用setvar=%var:~1%脱去环境变量var串首的第一个引号,如果串首不存在引号则第一个字符被脱去;
2-2、可以使用set%var:*"=%脱去环境变量var串首的第一个引号,如果串首不存在引号则变量值不变;
2-3、可以使用setvar=%var:~0,-1%脱去环境变量var串尾的最后一个引号,如果串尾不存在引号则最后一个被脱去;
2-4、可以使用set"var=%var%脱去环境变量var串尾的最后一个引号,如果串尾不存在引号则环境变量被清空;
2-5、可以使用setvar=%var:~1,-1%脱去环境变量var串最外侧的一对引号,如果串外侧不存在引号则外侧一对字符被脱去;
2-6、可以使用%var:*"=set"var=%脱去环境变量var串最外侧的一对引号,如果串外侧不存在引号则出现语法错误;
2-7、可以使用set"var=%var:"=%"脱去环境变量var串中可能出现的所有引号,如果串外侧不出现引号则变量值不变;与1-3不同的是,它容许字符串的匹配引号对内出现特殊控制字符;