Batch file 为什么在使用SETLOCAL命令时,为命令提示符切换当前目录的批处理文件不起作用?
我正在命令提示符窗口中运行以下批处理脚本,以转到特定文件夹Batch file 为什么在使用SETLOCAL命令时,为命令提示符切换当前目录的批处理文件不起作用?,batch-file,cmd,Batch File,Cmd,我正在命令提示符窗口中运行以下批处理脚本,以转到特定文件夹 @echo off SETLOCAL set ispyfolder=true if not "%~1"=="py" if not "%~1"=="pyfolder" set ispyfolder=false if "%ispyfolder%"=="true" ( C: cd C:\Users\ankagraw\AppData\Local\Continuum ) 当SETLOCAL存在时(第2行),此代码不起作用。当前
@echo off
SETLOCAL
set ispyfolder=true
if not "%~1"=="py" if not "%~1"=="pyfolder" set ispyfolder=false
if "%ispyfolder%"=="true" (
C:
cd C:\Users\ankagraw\AppData\Local\Continuum
)
当SETLOCAL存在时(第2行),此代码不起作用。当前目录与从命令提示符窗口中运行批处理文件之前的目录相同。如果我删除这一行,那么脚本工作正常
我已将脚本命名为go2
。所以我想这样称呼它:
go2 pyfolder
我想使用SETLOCAL来避免错误地接触全局环境变量
我想我犯了一个很简单的错误。但我对脚本编写还不熟悉,因此无法理解它。您的批处理代码可以正常工作。我认为真正的问题是,在Windows命令解释器处理批处理文件的其他命令之前,在发布的块之后使用ENDLOCAL命令 ENDLOCAL由Windows命令解释器隐式执行,前提是批处理文件在终止批处理文件的执行之前不包含更多命令,这对于了解批处理文件何时从命令提示符窗口中执行非常重要,预期行为是批处理文件应修改已在运行的命令进程 让我们看看下面改进的批处理代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "ispyfolder=true"
if /I not "%~1" == "py" if /I not "%~1" == "pyfolder" set "ispyfolder=false"
if not defined LOCALAPPDATA set "LOCALAPPDATA=%USERPROFILE%\AppData\Local"
if "%ispyfolder%" == "true" echo cd /D "%LOCALAPPDATA%\Continuum"
rem Other commands in this local environment like the one below.
echo 1: Current directory is: %CD%
endlocal
rem Commands executed in previous environment with previous current directory.
echo 2: Current directory is: %CD%
关于使用两次设置“变量=值”
的原因,请参见
在这段改进的代码中,通过使用命令IF的两次选项/I
,使两个字符串与第一批文件参数的比较不区分大小写
LOCALAPPDATA是自Windows Vista引入本地应用程序数据目录以来预定义的。在Windows XP上,默认情况下没有本地应用程序数据目录,因此也没有LOCALAPPDATA环境变量。但是,我添加了一行代码,以便在本地环境中定义此环境变量,以防您的计算机上不需要定义它
命令CD也可以选择/D
来更改驱动器
有关命令SETLOCAL和ENDLOCAL的详细信息,请阅读
然后在命令提示符窗口中运行此批处理文件,当前目录为C:\Users\ankagraw
,第一个参数为py
或pyfolder
。您将获得以下输出:
1: Current directory is: C:\Users\ankagraw\AppData\Local\Continuum
2: Current directory is: C:\Users\ankagraw
从这里可以看出,命令ENDLOCAL也会还原当前目录。这可能是由于批处理文件的命令行位于endlocal
下方,或者执行从命令提示符窗口发布的批处理文件时出现的问题
解决方案是用下面的行替换命令行endlocal
,或者如果批处理文件不包含任何其他内容,则添加此命令行
endlocal & cd /D "%CD%"
在执行第一个命令之前,Windows命令解释器使用环境变量的当前值在此展开环境变量CD。因此,在计算机上执行批处理文件时,参数为py
或pyfolder
命令行:
endlocal & cd /D "C:\Users\ankagraw\AppData\Local\Continuum"
ENDLOCAL删除本地环境变量表并恢复以前的环境变量表,恢复命令扩展和延迟扩展的状态,还恢复以前的当前目录。但是执行下一个命令CD,将当前目录再次更改为上一个命令环境中的目录
因此,我建议在您的计算机上使用:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "ispyfolder=true"
if /I not "%~1" == "py" if /I not "%~1" == "pyfolder" set "ispyfolder=false"
if "%ispyfolder%" == "true" echo cd /D "%LOCALAPPDATA%\Continuum"
endlocal & cd /D "%CD%"
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
cd/?
echo/?
endlocal/?
如果/?
rem/?
设置/?
setlocal/?
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "ispyfolder=true"
if /I not "%~1" == "py" if /I not "%~1" == "pyfolder" set "ispyfolder=false"
if not defined LOCALAPPDATA set "LOCALAPPDATA=%USERPROFILE%\AppData\Local"
if "%ispyfolder%" == "true" echo cd /D "%LOCALAPPDATA%\Continuum"
rem Other commands in this local environment like the one below.
echo 1: Current directory is: %CD%
endlocal
rem Commands executed in previous environment with previous current directory.
echo 2: Current directory is: %CD%
关于使用两次设置“变量=值”
的原因,请参见
在这段改进的代码中,通过使用命令IF的两次选项/I
,使两个字符串与第一批文件参数的比较不区分大小写
LOCALAPPDATA是自Windows Vista引入本地应用程序数据目录以来预定义的。在Windows XP上,默认情况下没有本地应用程序数据目录,因此也没有LOCALAPPDATA环境变量。但是,我添加了一行代码,以便在本地环境中定义此环境变量,以防您的计算机上不需要定义它
命令CD也可以选择/D
来更改驱动器
有关命令SETLOCAL和ENDLOCAL的详细信息,请阅读
然后在命令提示符窗口中运行此批处理文件,当前目录为C:\Users\ankagraw
,第一个参数为py
或pyfolder
。你得到了