Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 为什么在使用SETLOCAL命令时,为命令提示符切换当前目录的批处理文件不起作用?_Batch File_Cmd - Fatal编程技术网

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
来更改驱动器

有关命令SETLOCALENDLOCAL的详细信息,请阅读

然后在命令提示符窗口中运行此批处理文件,当前目录为
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/?

批处理代码有效。我认为真正的问题是,在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
来更改驱动器

有关命令SETLOCALENDLOCAL的详细信息,请阅读

然后在命令提示符窗口中运行此批处理文件,当前目录为
C:\Users\ankagraw
,第一个参数为
py
pyfolder
。你得到了