是否在此处创建了我的变量的副本?

时间:2015-04-22 14:24:13

标签: windows batch-file

我正在尝试创建一个批处理文件,每次我在Windows中使用一些好的别名打开cmd提示符时都会运行该文件。有时当我工作时,我必须继续引用一个特定的目录,然后四处走动并回到它;到目前为止这么好但我无法弄清楚这个问题我得到了一个变量。

::initialize variable to root
set cwd=C:\                
::save current directory
doskey setcwd=set cwd=%CD% 
::jump back to saved directory 
doskey gocwd=cd %cwd%      
::print the variable 
doskey pcwd=echo %cwd%     

以下是我尝试使用这些命令时发生的事情:

(opening up cmd.exe, it starts in C:\Users\<my user name>, batch file executes)

> pwd
C:\
> cd foo\bar\baz
foo\bar\baz
> pwd 
foo\bar\baz
> pcwd
C:\                     <-- expected, havent set it yet 
> echo %cwd%            <-- checking it manually just to make sure it says 'C:\' 
(no output)             <-- strange, I thought I set it to C:\ 
> setcwd 
> pcwd
C:\                     <-- what? I thought I set it to the current directory
> echo %cwd%            <-- checking again to make sure
C:\Users\<my user name> <-- what- I don't even... 
> gocwd
> pwd
C:\                     <-- how... 

这基本上是我所面临的问题;看起来我有两个不同的cwd变量实例;我的批处理文件中的那个,以及我手动打印的那个?

*注意我确实在我的文件顶部包含setlocal EnableDelayedExpansion,理解我在doskeys定义中使用的变量不会被扩展,直到我执行命令,而不是在当时读取文件;仍然没有帮助。

2 个答案:

答案 0 :(得分:0)

您需要向我们提供整批产品。如果该批次中有setlocal命令,则批次终止时将撤消对环境的任何变更。

::initialize variable to root
cwd=C:\                

不正确。你需要

::initialize variable to root
SET cwd=C:\                

使用隐身setlocalcwd将保持&#34;为空&#34;

答案 1 :(得分:0)

::initialize variable to root
set "cwd=C:\."
::save current directory
doskey setcwd=set "cwd=%%CD%%"
::jump back to saved directory 
doskey gocwd=if defined cwd (cd /d "%%cwd%%") else echo NO CWD
::print the variable 
doskey pcwd=if defined cwd (echo %%cwd%%) else echo NO CWD

如果在定义宏时没有转义变量,则宏中不会引用变量,因为解析器会在解析时用变量替换变量。