如何确保变量保留!在另一个脚本中设置的符号?

How to ensure variable retains ! symbol when set in another script?

提问人:chrtak 提问时间:7/10/2023 最后编辑:Compochrtak 更新时间:7/10/2023 访问量:32

问:

我有一个“环境文件”脚本,我在其中设置了自动化例程中使用的多个变量。一个变量是密码,它有一个 !象征。我的问题是,在我需要使用该变量的主脚本中,该变量使用SETLOCAL ENABLEDELAYEDEXPANSION,因此该变量无法正确呈现。

我该如何解决这个问题?

_env.cmd

SET "FTP_PSSWRD=CatDog!"

MainScript.cmd

SETLOCAL ENABLEDELAYEDEXPANSION
CALL "_env.cmd"

ECHO "%FTP_PSSWRD%"
变量 batch-file cmd

评论

0赞 Compo 7/10/2023
您没有向我们证明延迟扩张的原因。请提交实际的脚本内容,而不是毫无意义地省略它,让我们决定,或者至少为您的特定用户案例提供有效的解决方法。
0赞 Mofi 7/10/2023
不要使用延迟变量扩展。始终可以编写批处理文件代码,既可以完全避免使用延迟变量扩展的要求,也可以使用它而不将文件/文件夹名称或环境变量值中的感叹号解释为延迟扩展变量引用的开头/结尾。在发布的代码中应与开头一起使用,以完整定义所需的执行环境。setlocal EnableExtensions DisableDelayedExpansion@echo offMainScript.cmd
0赞 Mofi 7/10/2023
有关命令 SETLOCALENDLOCAL 的详细信息,请阅读此答案。它是关于一个任务,其中一次批处理文件将环境变量名称传递给另一个批处理文件,该文件使用延迟变量扩展执行某些操作,并将字符串值返回到分配给环境变量的主批处理文件,这些环境变量的名称将传递给子批处理文件。代码已得到充分解释。
0赞 Mofi 7/10/2023
顺便说一句:最好使用而不是仅当批处理文件始终位于 的目录中。然后,即使进程的当前目录不是包含两个批处理文件的目录,子批处理文件的调用也有效。 扩展到当前处理的批处理文件的完整目录路径,始终以反斜杠结尾,这是 Windows 上的目录分隔符。CALL "%~dp0_env.cmd"CALL "_env.cmd"_env.cmdMainScript.cmdcmd.exe%~dp0

答:

1赞 jeb 7/10/2023 #1

存在不同的解决方案。

  1. 修改密码中的感叹号

    设置“FTP_PSSWRD=CatDog^!”

但请注意,当有插入符号时,它们也需要被转义。

SET "FTP_PSSWRD=CatDog^! and a single ^^ caret"

但是,如果只有插入符号而没有感叹号

SET "FTP_PSSWRD=A single ^ caret"

但现在,它只有在启用延迟扩展的情况下才有效

  1. 使用 DisableDelayedExpansion 并从范围返回 调用 env.cmd 文件,但先使用:

    setlocal DisableDelayedExpansion

调用后,需要离开 setlocal 作用域并传输变量。
请参阅使环境变量在 ENDLOCAL 中存活

setlocal DisableDelayedExpansion
CALL "_env.cmd"
%endlocal% FTP_PSSWRD

ECHO "!FTP_PSSWRD!"
  1. 使用创建和 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"