如何在批处理文件中使用SETLOCAL命令?

42

如何在批处理文件中使用setlocal?我正在学习脚本编写,需要通俗易懂地解释。

我的一个脚本会停止并显示< was unexpected at this time,这可能与脚本中没有任何setlocal语句有关。

3个回答

27

你需要将第一行改为SETLOCAL。这个例子来自下面链接的文章:

rem *******Begin Comment**************
rem This program starts the superapp batch program on the network,
rem directs the output to a file, and displays the file
rem in Notepad.
rem *******End Comment**************
@echo off
setlocal
path=g:\programs\superapp;%path%
call superapp>c:\superapp.out
endlocal
start notepad c:\superapp.out

SETLOCAL 的最常见用途是开启命令扩展并允许变量的延迟扩展:

SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

想要了解更多关于SETLOCAL的信息,请参考微软TechNet上的命令行参考

Setlocal的直接链接。


3
可以给我一个它如何工作的例子吗?你会如何以及为什么使用它? - Dre_Dre
14
链接网站的第一句话已经解释了这一点:“开始在批处理文件中本地化环境变量。本地化将持续进行,直到遇到匹配的endlocal命令或批处理文件的结尾。” 换句话说,它允许您设置环境变量(通常是全局的),仅在批处理文件内部可见,并在执行ENDLOCAL调用或批处理文件结束时自动清除它们。 - Ken White
是的,这是一个很好的例子 - 如果您需要将某些内容添加到PATH变量中,但需要多次运行脚本,则可以像示例中那样进行设置。此外,您不需要在脚本之后清理环境。也就是说,在您设置任何内容之前调用setlocal,您可以使Windows shell脚本的行为类似于Bash脚本(不能更改父shell的环境)。 - Tomasz Gandor
2
请注意,setlocal 命令也会将任何目录更改设置为本地目录!这意味着在执行完命令后,您将返回到原始目录。 - Dylan Watson

11

假设这段代码:

If "%getOption%" equ  "yes" (
   set /P option=Enter option: 
   echo Option read: %option%
)

之前的代码不起作用,因为%option%值只会被替换一次,当IF命令被解析(在执行之前)时。你需要“延迟”变量值的扩展,直到SET /P命令修改了变量值:

setlocal EnableDelayedExpansion
If "%getOption%" equ  "yes" (
   set /P option=Enter option: 
   echo Option read: !option!
)

请检查:

set var=Before
set var=After & echo Normal: %var%  Delayed: !var!

猜猜输出结果是什么...


1
这个问题的答案是“之前”吗? - Dre_Dre
2
这是“正常:延迟之前:延迟之后”,但必须启用延迟变量扩展才能使其正常工作。输入“SET /?”并仔细阅读“最后,已添加对延迟环境变量扩展的支持。” - Aacini

-5

尝试这个:

SET PATH=%PATH%;%~dp0;

这将获取您正在运行批处理文件的本地文件夹,并将其添加到当前路径中。

例如:如果您从d:\tools\mybatch.bat运行.bat.cmd,它将添加d:\tools到当前路径中,以便可以在该文件夹中找到其他文件。


3
这(试图)回答这个问题的方式是什么? - Stephan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接