批处理 变量的 两边的引号如何去掉?

网上看了不少文章,都不能得到完美无缺的答案。最后自己琢磨出一个绝妙的方法:

@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!

你可能感兴趣的:(cmd,Batch,set,cmd,findstr)