gpt4 book ai didi

windows - 批处理文件嵌套 setlocal - 仅设置一次可选参数

转载 作者:可可西里 更新时间:2023-11-01 09:47:41 24 4
gpt4 key购买 nike

我有一个带有一些功能的批处理文件。每个函数都使用 setlocal,这样它的变量就不会污染主批处理脚本。我注意到我第一次在主批处理脚本中而不是在每个嵌套的 setlocal 中只需要参数 ENABLEDELAYEDEXPANSION。例如:

@echo off
setlocal ENABLEDELAYEDEXPANSION

set VAR=hi
CALL :function

echo bye
exit /b 0

:function
setlocal
echo !VAR!
exit /b 0

这是否允许在批处理文件中使用,因为我找不到它的文档,除非如下所述。这肯定比只为每个函数编写 setlocal 而不是指定额外的参数要容易得多。

setlocal/? 是关于 ENABLEDELAYEDEXPANSION 的:

These modifications last until the matching ENDLOCAL command, regardless of their setting prior to the SETLOCAL command.

所以也许这意味着即使使用另一个 setlocal 设置也保持不变?

最佳答案

好吧,您可以通过编写一些简单的测试来回答您自己的问题。但是我告诉你,答案是肯定的,你只需要开启一次延迟扩展。此后的每个 SETLOCAL 都将继承先前的延迟扩展状态,除非被 DisableDelayedExpansion 明确覆盖。

@echo off
echo delayed Expansion normally starts out disabled: !temp!
setlocal enableDelayedExpansion
echo delayed exapnsion now enabled: !temp!
call :test
exit /b

:test
setlocal
echo delayed expansion still enabled: !temp!
exit /b

如果您正在学习批处理,那么您应该期望做大量的实验,因为文档很差,有时甚至是错误的。


只有当您知道可以在整个脚本中启用延迟扩展时,您只启用一次延迟扩展的策略才是好的。

延迟扩容确实批量解决了很多讨厌的问题,但不幸的是它也会带来问题。

如果值包含 ! 并且启用延迟扩展,则 CALL 参数 %1 或 FOR 变量 %%A 的扩展已损坏。我编写的许多中等复杂的脚本都需要仔细管理延迟扩展状态。

在单个例程中,您可以随时了解状态。但是在子程序或函数开始时,您可能不知道调用者的状态。作为一般规则,如果我的例程需要特定状态,我会在每个例程的顶部明确启用或禁用延迟扩展。


请注意 - cmd.exe 的每个新实例不会继承前一个 session 的延迟展开状态。通常每个 cmd.exe session 开始时都会禁用延迟扩展。

这很重要,因为管道和 FOR/F %%A IN ('someCommand') DO ... 都会隐式启动新的 cmd.exe session 。参见 Why does delayed expansion fail when inside a piped block of code?获取更多信息。

关于windows - 批处理文件嵌套 setlocal - 仅设置一次可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27559347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com