网上看了不少文章,都不能得到完美无缺的答案。最后自己琢磨出一个绝妙的方法:
@rem style:Cobol
@echo off
set var="1"2"3
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo %var%
cd.
解决了:单数个双引号,命令定界混淆;首尾误删除;命令执行异常退出等。
估计 也可以安排个 set "%var%%var%",待以后试试。
具体测试用例如下:
@echo off
set var="1"2"3"
echo.s1=%var%
set "var=%var:~1%"
echo.s1=%var%
set var=1"2"3"
echo.s1=%var%
set "var=%var:~1%"
echo.s1=%var%
set var=
echo.s1=%var%
set "var=%var:~1%"
echo.s1=%var%
rem 脱去环境变量 var 的第一个字符;如果 var 原串为空,则结果为表达式内容 【~1】。
set var="1^"2^"3"
echo.s2=%var%
set var=%var:*"=%
echo.s2=%var%
set var=1^"2^"3"
echo.s2=%var%
set var=%var:*"=%
echo.s2=%var%
set var=123"
echo.s2=%var%
set var=%var:*"=%
echo.s2=%var%
set var=123
echo.s2=%var%
set var=%var:*"=%
echo.s2=%var%
set var=
echo.s2=%var%
set var=%var:*"=%
echo.s2=%var%
rem 脱去环境变量 var 的第一个引号及其前面的内容,如果不存在引号,则变量值不变;如果 var 原串为空,则结果为表达式内容 【*"=】。
set var="1^"2^"3"
echo.s21=%var%
set var=%var:*"=*%
echo.s21=%var%
set var=1^"2^"3"
echo.s22=%var%
set var=%var:*"=*%
echo.s22=%var%
set var=123"
echo.s23=%var%
set var=%var:*"=*%
echo.s23=%var%
set var=123
echo.s24=%var%
set var=%var:*"=*%
echo.s24=%var%
set var=
echo.s25=%var%
set var=%var:*"=*%
echo.s25=%var%
rem dfe fefef
set "var="1^"2^"3""
echo.s3=%var%
set var=%var:~0,-1%
echo.s3=%var%
set "var="1^"2^"3"
echo.s3=%var%
set var=%var:~0,-1%
echo.s3=%var%
set "var="123"
echo.s3=%var%
set var=%var:~0,-1%
echo.s3=%var%
set "var="
echo.s3=%var%
set var=%var:~0,-1%
echo.s3=%var%
rem 脱去环境变量 var 的最后一个字符;如果原串为空,则结果为表达式内容 【~0,-1】。
set "var="1^"2^"3""
echo.s4=%var%
set "var=%var%
echo.s4=%var%
set "var="1^"2^"3"
echo.s4=%var%
set "var=%var%
echo.s4=%var%
set "var="123"
echo.s4=%var%
set "var=%var%
echo.s4=%var%
set "var=123"
echo.s4=%var%
set "var=%var%
echo.s4=%var%
set var=
echo.s4=%var%
set "var=%var%
echo.s4=%var%
rem 脱去环境变量 var 的最后一个引号及其后面的内容,如果不存在引号,则变量值不变;如果原串为空,则结果为空。
set "var="1^"2^"3""
echo.s5=%var%
set var=%var:~1,-1%
echo.s5=%var%
set var="1"2"3
echo.s5=%var%
set var=%var:~1,-1%
echo.s5=%var%
set var=1"2"3"
echo.s5=%var%
set var=%var:~1,-1%
echo.s5=%var%
set var=1"2"3
echo.s5=%var%
set var=%var:~1,-1%
echo.s5=%var%
set var=123
echo.s5=%var%
set var=%var:~1,-1%
echo.s5=%var%
set var=
echo.s5=%var%
set var=%var:~1,-1%
echo.s5=%var%
rem 脱去环境变量 var 的第一个字符和最后一个字符。如果原串为空,则结果为表达式内容 【~1,-1】。
set var=错误
set var=""
echo,s71=%var%
set "var=%var:"=%"
echo,s71=%var%
set var=错误
set var="""
echo,s72=%var%
set "var=%var:"=%"
echo,s72=%var%
set var=错误
set "var=""
echo,s73=%var%
set "var=%var:"=%"
echo,s73=%var%
set var=错误
set var="1:2"
echo,s74=%var%
set "var=%var:"=%"
echo,s74=%var%
set var=错误
set var="1=2"
echo,s75=%var%
set "var=%var:"=%"
echo,s75=%var%
set var=错误
set var="~`!@#$%^&*)(-_+=}{][|\:;'><,.?/"
echo,s76=%var%
set "var=%var:"=%"
echo,"s76=%var%"
set var=错误
set var="~`!@#$%%^&*)(-_+=}{][|\:;'><,.?/"
echo,s77=%var%
set "var=%var:"=%"
echo,"s77=%var%"
set var=错误
set var="~`!@#$%^&*)a)(}{)(c(-_+=][\:;'|<>,.?/" "a""a"
echo,s78=%var%
set "var=%var:"=%"
echo,"s78=%var%"
set var=错误
set var="~`!@#$%^&*))c(}{)(e(-_+=][|\:;'><,.?/"
echo,s79=%var%
set "var=%var:"=%"
echo,"s79=%var%"
set var=错误
set var="~`!@#$""%""^&*))c(}{)(e(-_+=]["|\:;'>""<"",.?/"
echo,s791=%var%
set "var=%var:"=%"
echo,"s791=%var%"
set var=错误
set var="~`!@#$%^&*)a)(}{)"(c(-_+=]["\:;'|<>,.?/"
echo,s792=%var%
set "var=%var:"=%"
echo,"s792=%var%"
set var=错误
set var="""1""%""2""<""3"">""4"5""\""6""/"""
echo,"s793=%var%"
set "var=%var:"=%"
echo,"s793=%var%"
set var=错误
set var=""1""%""2""<""3"">""4""^:""5""\""6""/"""
echo,"s794=%var%"
set "var=%var:"=%"
echo,"s794=%var%"
set var=错误
set var="%""<"">"3"":""\"4"/"
echo,"s795=%var%"
set "var=%var:"=%"
echo,"s795=%var%"
set var=错误
set var="%""<"">"3""9""\""/"
echo,"s796=%var%"
set "var=%var:"=%"
echo,"s796=%var%"
set var=错误
set var=3f2f3f32s
echo,"s797=%var%"
set "var=%var:"=%"
echo,"s797=%var%"
set var=错误
set var="~`!@#$^&*)(-_+}{][|\:'>=<.?/,;"
echo,s798=%var%
set "var=%var:"=%"
echo,"s798=%var%"
rem 脱去环境变量 var 串中可能出现的所有引号,如果不存在引号和百分号,则变量值不变;
rem 双引号是特殊字符,作用是包裹在成对的双引号内的其它字符(非")会被当成普通字面字符。
rem 在两两配对的双引号外侧的特殊字符没有被包裹住,会起到特殊作用。如: "%"1" 中 < 没有被包裹,造成重定向失败。
rem 【%】 是特殊符号,表示变量取值。 要转义百分号为普通字面量,需用两个百分号 %% 表示一个百分号 % 。
rem 【%变量名:】 是 set 的表达式形式,% 和 : 之间的内容会被当成变量名。 如果变量名未定义,则取值为空,
rem 保留 【%变量名:】 的前面和后面的内容。如果没有特殊字符 %,则 : 被当成普通字面量。
rem 【<()[]{}】 等特殊符号,set 设置变量时要加双引号。
rem 【<()[]{}】 等特殊符号,echo 输出时要加双引号。否则提示错误 “此时不应有 <。”。
set "var="1^"2^"3""
echo.s60=%var%
%var:*"=set "var=%
echo.s60=%var%
set var="1"2"3
echo.s61=%var%
%var:*"=set "var=%
echo.s61=%var%
set var=1"2"3"
echo.s62=%var%
%var:*"=set "var=%
echo.s62=%var%
set var=1"2"3
echo.s63=%var%
%var:*"=set "var=%
echo.s63=%var%
set var="123
echo.s64=%var%
%var:*"=set "var=%
echo.s64=%var%
set var=123"
echo.s65=%var%
%var:*"=set "var=%
echo.s65=%var%
set var=1"23
echo.s66=%var%
%var:*"=set "var=%
echo.s66=%var%
set var=12"3
echo.s67=%var%
%var:*"=set "var=%
echo.s67=%var%
set var=123
echo.s68=%var%
%var:*"=set "var=%
echo.s68=%var%
set var=""
echo.s69=%var%
%var:*"=set "var=%
echo.s69=%var%
set var="
echo.s691=%var%
%var:*"=set "var=%
echo.s691=%var%
set var=
echo.s692=%var%
%var:*"=set "var=%
echo.s692=%var%
rem 脱去环境变量 var 串中最外层一对引号及引号外侧的内容;
rem 如果原串只有一个引号,则脱去引号及其前面的内容。
rem 如果原串为空或原串不存在引号,则出现语法错误。
set "var="1^"2^"3""
echo.s80=%var%
set var=%var:*"=set "var=%
echo.s80=%var%
set var="1"2"3
echo.s81=%var%
set var=%var:*"=set "var=%
echo.s81=%var%
set var=1"2"3"
echo.s82=%var%
set var=%var:*"=set "var=%
echo.s82=%var%
set var=1"2"3
echo.s83=%var%
set var=%var:*"=set "var=%
echo.s83=%var%
set var="123
echo.s84=%var%
set var=%var:*"=set "var=%
echo.s84=%var%
set var=123"
echo.s85=%var%
set var=%var:*"=set "var=%
echo.s85=%var%
set var=1"23
echo.s86=%var%
set var=%var:*"=set "var=%
echo.s86=%var%
set var=12"3
echo.s87=%var%
set var=%var:*"=set "var=%
echo.s87=%var%
set var=123
echo.s88=%var%
set var=%var:*"=set "var=%
echo.s88=%var%
set var=""
echo.s89=%var%
set var=%var:*"=set "var=%
echo.s89=%var%
set var="
echo.s891=%var%
set var=%var:*"=set "var=%
echo.s891=%var%
set var=
echo.s892=%var%
set var=%var:*"=set "var=%
echo.s892=%var%
rem 替换失败,大多数结果为表达式内容。
:: set "var="1^"2^"3""
:: echo.s90=%var%
:: @rem set var=% ~var%
:: echo.s90=%var%
rem 异常退出。
cd.
echo.error=%errorlevel%
set "var="1^"2^"3""
echo.sA0=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
rem echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA0=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var="1"2"3
echo.sA1=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
rem > nul && set "var=%var:~1,-1%"
echo.sA1=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var=1"2"3"
echo.sA2=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA2=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var=1"2"3
echo.sA3=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA3=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var="123
echo.sA4=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA4=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var=123"
echo.sA5=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA5=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var=1"23
echo.sA6=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA6=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var=12"3
echo.sA7=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA7=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var=123
echo.sA8=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA8=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var=""
echo.sA9=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA9=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var="
echo.sA91=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA91=%var%
echo.error=%errorlevel%
cd.
echo.error=%errorlevel%
set var=
echo.sA92=%var%
echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
echo.sA92=%var%
echo.error=%errorlevel%
rem 正则替换两边的双引号,精准定位,不会误删。
pause
总结:
(5) 去除字符串中的双引号
具体测试案例,请参考 "CMD Set 命令详解案例.bat"
[1] %~1, %~2, ... , %n
for %%i in ("") do ( %%~i )
去外层双引号的两种情况是,字符串存在于命令行参数 %1 至 %9 中或字符串存在于 for 替代变量 %%i 中。
[2] echo "%var%%var%"| findstr /i /r "^"""""".*""""""$" > nul && set "var=%var:~1,-1%"
正则剔除两边的双引号,精准定位,不会误删。
[3] set var=%var:~1%
脱去环境变量 var 的第一个字符;如果 var 原串为空,则结果为表达式内容 【~1】。
[4] set var=%var:*"=%
脱去环境变量 var 的第一个引号及其前面的内容。如果不存在引号,则变量值不变;如果 var 原串为空,则结果为表达式内容 【*"=】。
set var==%var:"*=*% 会怎样?
替换环境变量 var 的第一个引号及其前面的内容为字面量 * 。如果不存在引号,则变量值不变;如果 var 原串为空,则结果为表达式内容 【"*=】。
[5] set var=%var:~0,-1%
脱去环境变量 var 的最后一个字符;如果原串为空,则结果为表达式内容 【~0,-1】。
[6] set "var=%var%
脱去环境变量 var 的最后一个引号及其后面的内容,如果不存在引号,则变量值不变;如果原串为空,则结果为空。
[7] set var=%var:~1,-1%
脱去环境变量 var 的第一个字符和最后一个字符。如果原串为空,则结果为表达式内容 【~1,-1】。
[8] %var:*"=set "var=%
脱去环境变量 var 串中最外层一对引号及引号外侧的内容;
如果原串只有一个引号,则脱去引号及其前面的内容;如果原串为空或原串不存在引号,则出现语法错误。
[9] set "var=%var:"=%"
脱去环境变量 var 串中可能出现的所有引号,如果不存在引号和百分号,则变量值不变;
双引号是特殊字符,作用是包裹在成对的双引号中的其它字符(非")会被当成普通字面字符。
在两两配对的双引号外侧的特殊字符没有被包裹住,会起到特殊作用。如: "%"1
【%】 是特殊符号,表示变量取值。 要转义百分号为普通字面量,需用两个百分号 %% 表示一个百分号 % 。
【%变量名:】 是 set 的表达式形式,% 和 : 之间的内容会被当成变量名。 如果变量名未定义,则取值为空,
保留 【%变量名:】 的前面和后面的内容。如果没有特殊字符百分号 % ,则分号 : 被当成普通字面量。
【<>()[]{}】 等特殊符号,set 设置变量时要加双引号。
【<>()[]{}】 等特殊符号,echo 输出时要加双引号。否则提示错误 “此时不应有 <。”。
参考:批处理 变量的 两边的引号如何去掉? - BAT求助&讨论 - 批处理之家 批处理_BAT脚本_PowerShell_VBS_CMD_DOS_Perl_Python - Powered by Discuz!