CD环境变量何时更新?

And*_*ler 2 cmd batch-file

CD通常会发布使用批处理脚本中的环境变量来获取当前工作目录的tipp .但是CD在进入call另一个批处理文件时不会更新.然后该cd命令回显另一个批处理文件的新路径,但%CD%(或!CD!)不更新.例:

@echo off
 cd %~dp0
 echo in %0: CD=%CD%
 pause
 call X:\testcall.cmd
Run Code Online (Sandbox Code Playgroud)

另存为C:\testcall.cmdX:\testcall.cmd,然后运行C:\testcall.cmd.您应该看到值CD没有改变.这似乎不依赖于call; 以下都不起作用:

start /D <NEW_DIR> <OTHER_CMD_FILE>
start cmd /c <NEW_DIR>\<OTHER_CMD_FILE>
cmd /c <NEW_DIR>\<OTHER_CMD_FILE>
<NEW_DIR>\<OTHER_CMD_FILE>
cd %~dp0
pushd %~dp0
Run Code Online (Sandbox Code Playgroud)

CD将保持旧值,而cd(命令)显示正确的目录.因此我设置CD在脚本的开头:

set CD=%~dp0
Run Code Online (Sandbox Code Playgroud)

......而假设cmd.exe的设置CD仅当此变量尚未取消设置.真正?

Jon*_*han 6

%CD%当前目录,而%~dp0当前正在运行的脚本的目录(尾随'\').

另外,不要设置环境.var被调用CD,因为它将覆盖默认的%CD%pseudo-var,并且会令人难以置信地混淆 - 请参阅OldNewThing - ERRORLEVEL不是%ERRORLEVEL%.

例如,运行c:\ temp\a.cmd时,它是:

@echo off
echo Currently running script: %~dpnx0
cd %~dp0
echo scriptDir=%~dp0, CD=%CD%
cd %~dp0a
echo scriptDir=%~dp0, CD=%CD%
set CD=bogus value
echo scriptDir=%~dp0, CD=%CD%
Run Code Online (Sandbox Code Playgroud)

输出:

Currently running script: c:\temp\a.cmd
scriptDir=c:\temp\, CD=c:\temp
scriptDir=c:\temp\, CD=c:\temp\a
scriptDir=c:\temp\, CD=bogus value
Run Code Online (Sandbox Code Playgroud)