我发现这里介绍的所有解决方案对我来说都不够完整,并且在一种或另一种情况下都不起作用。
注意:
似乎 stackoverflow 错误地处理了复制粘贴代码中的制表符(并丢失了其他字符,例如\x01
),因此如果您直接通过 CTRL+C 复制以下代码,则可能无法正常工作。使用最后的链接直接下载脚本。
trim_var.bat:
@echo off
rem drop the output variable value
if not "%~2" == "" if not "%~1" == "%~2" set "%~2="
if not defined %~1 exit /b 0
setlocal DISABLEDELAYEDEXPANSION
rem Load and replace a value quote characters by the \x01 character.
call set "RETURN_VALUE=%%%~1:"=%%"
:TRIM_LEFT_LOOP
if not defined RETURN_VALUE exit /b 0
if not ^%RETURN_VALUE:~0,1%/ == ^ / if not ^%RETURN_VALUE:~0,1%/ == ^ / goto TRIM_RIGHT_LOOP
set "RETURN_VALUE=%RETURN_VALUE:~1%"
if not defined RETURN_VALUE exit /b 0
goto TRIM_LEFT_LOOP
:TRIM_RIGHT_LOOP
if not defined RETURN_VALUE exit /b 0
if not ^%RETURN_VALUE:~-1%/ == ^ / if not ^%RETURN_VALUE:~-1%/ == ^ / goto TRIM_RIGHT_LOOP_END
set "RETURN_VALUE=%RETURN_VALUE:~0,-1%"
goto TRIM_RIGHT_LOOP
:TRIM_RIGHT_LOOP_END
rem recode quote and exclamation characters
set "__ESC__=^"
set __QUOT__=^"
set "__EXCL__=!"
set "RETURN_VALUE=%RETURN_VALUE:!=!__EXCL__!%"
set "RETURN_VALUE=%RETURN_VALUE:^=!__ESC__!%"
set "RETURN_VALUE=%RETURN_VALUE:=!__QUOT__!%"
rem safe set
setlocal ENABLEDELAYEDEXPANSION
for /F "tokens=* delims=" %%i in ("!RETURN_VALUE!") do for /F "tokens=* delims=" %%j in ("%%i") do (
endlocal
endlocal
if not "%~2" == "" (
set "%~2=%%j"
) else (
set "%~1=%%j"
)
)
exit /b 0
echo_var.bat:
@echo off
if not defined %~1 (
echo.%~2%~3
exit /b 0
)
setlocal DISABLEDELAYEDEXPANSION
rem Load and replace a value quote characters by the \x01 character.
call set "RETURN_VALUE=%%%~1:"=%%"
rem recode quote and exclamation characters
set "__ESC__=^"
set __QUOT__=^"
set "__EXCL__=!"
set "RETURN_VALUE=%RETURN_VALUE:!=!__EXCL__!%"
set "RETURN_VALUE=%RETURN_VALUE:^=!__ESC__!%"
set "RETURN_VALUE=%RETURN_VALUE:=!__QUOT__!%"
rem safe echo
setlocal ENABLEDELAYEDEXPANSION
for /F "tokens=* delims=" %%i in ("!RETURN_VALUE!") do for /F "tokens=* delims=" %%j in ("%%i") do (
endlocal
endlocal
echo.%~2%%j%~3
)
exit /b 0
test_trim_var.bat:
@echo off
setlocal DISABLEDELAYEDEXPANSION
set myvar1= 1 ! 2 ^| 3 ^& 4 ^^ 5 = 6 , 7 ; 8 * 9 # 0 %% 1 / 2 \ 3 ? 4 ^> 5 ^< 6 " 7
call "trim_var.bat" myvar1 myvar2
call "echo_var.bat" myvar1 - -
call "echo_var.bat" myvar2 - -
输出:
- 1 ! 2 | 3 & 4 ^ 5 = 6 , 7 ; 8 * 9 # 0 % 1 / 2 \ 3 ? 4 > 5 < 6 " 7 -
-1 ! 2 | 3 & 4 ^ 5 = 6 , 7 ; 8 * 9 # 0 % 1 / 2 \ 3 ? 4 > 5 < 6 " 7-
最新实现:https ://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/std/trim_var.bat
优点:
- 安全处理几乎所有特定字符,如
!
, %
, ^
, "
.
缺点:
"
字符替换为\x01
字符,并且可能受当前代码页的影响(未测试)。