提问人:chrtak 提问时间:7/10/2023 最后编辑:Compochrtak 更新时间:7/10/2023 访问量:32
如何确保变量保留!在另一个脚本中设置的符号?
How to ensure variable retains ! symbol when set in another script?
问:
我有一个“环境文件”脚本,我在其中设置了自动化例程中使用的多个变量。一个变量是密码,它有一个 !象征。我的问题是,在我需要使用该变量的主脚本中,该变量使用SETLOCAL ENABLEDELAYEDEXPANSION,因此该变量无法正确呈现。
我该如何解决这个问题?
_env.cmd
SET "FTP_PSSWRD=CatDog!"
MainScript.cmd
SETLOCAL ENABLEDELAYEDEXPANSION
CALL "_env.cmd"
ECHO "%FTP_PSSWRD%"
答:
1赞
jeb
7/10/2023
#1
存在不同的解决方案。
修改密码中的感叹号
设置“FTP_PSSWRD=CatDog^!”
但请注意,当有插入符号时,它们也需要被转义。
SET "FTP_PSSWRD=CatDog^! and a single ^^ caret"
但是,如果只有插入符号而没有感叹号
SET "FTP_PSSWRD=A single ^ caret"
但现在,它只有在启用延迟扩展的情况下才有效
使用 DisableDelayedExpansion 并从范围返回 调用 env.cmd 文件,但先使用:
setlocal DisableDelayedExpansion
调用后,需要离开 setlocal 作用域并传输变量。
请参阅使环境变量在 ENDLOCAL 中存活
setlocal DisableDelayedExpansion
CALL "_env.cmd"
%endlocal% FTP_PSSWRD
ECHO "!FTP_PSSWRD!"
- 使用创建和 for-meta-variables 的宏,它们扩展到延迟扩展模式并独立于延迟扩展模式
%%!
%%^
!
^
FOR /F "tokens=1 delims== " %%! in ("!=! ^^^!") DO ^
FOR /F %%^^ in ("^ ^^^^%%!=%%!") DO ^
set ^"$lib.macrodefine.free=@FOR /F "tokens=1 delims== " %%%%! in ("%%!=%%! %%^%%^%%^%%!") DO ^
@FOR /F %%%%^^%%^^ in ("%%^ %%^%%^%%^%%^%%^%%!=%%^%%!") DO @"
setlocal EnableDelayedExpansion
call :test
endlocal
setlocal DisableDelayedExpansion
call :test
endlocal
exit /b
:test
%$lib.macrodefine.free% SET "FTP_PSSWRD=CatDog%%!"
set "FTP_PSSWRD"
评论
setlocal EnableExtensions DisableDelayedExpansion
@echo off
MainScript.cmd
CALL "%~dp0_env.cmd"
CALL "_env.cmd"
_env.cmd
MainScript.cmd
cmd.exe
%~dp0