Batch file 批处理环境变量问题

Batch file 批处理环境变量问题,batch-file,environment-variables,Batch File,Environment Variables,我对流程级变量没有问题,例如: Set a=ABC Echo '%a%' > 'ABC' 我理解为什么在注册表中设置的持久变量(在三个可能的位置之一)在当前会话中不可用: Setx a=ABC Echo '%a%' > '%a%' [Open a new command window:] Echo '%a%' > 'ABC' 当第一部分在脚本中,而最后两行出现在命令窗口(cmd)中时,情况也是如此。然而,当我在一个脚本中设置(setx)一个持久变量,然后运行另一个脚本来读取

我对流程级变量没有问题,例如:

Set a=ABC
Echo '%a%'
> 'ABC'
我理解为什么在注册表中设置的持久变量(在三个可能的位置之一)在当前会话中不可用:

Setx a=ABC
Echo '%a%'
> '%a%'
[Open a new command window:]
Echo '%a%'
> 'ABC'
当第一部分在脚本中,而最后两行出现在命令窗口(cmd)中时,情况也是如此。然而,当我在一个脚本中设置(setx)一个持久变量,然后运行另一个脚本来读取它时,结果对我来说是难以预测的。例如,我第一次运行以下脚本时,希望它设置变量(但不回显),而在所有后续运行时,由于变量是在调用脚本之前设置的,%a%的值应为ABC:

Echo '%a%'
Setx a ABC
Echo '%a%'
Pause
不幸的是,即使在第二次运行时,两个Echo语句都返回空值(“”)。正如我前面提到的,一个新的命令窗口将返回预期值('ABC')

更糟糕的是,有时我可以访问以前存储的变量的值,但之后我无法更改它。我怀疑在这些情况下,我是从另一个环境(系统vs用户vs机器)访问变量的,但我似乎无法理解这一点


为什么我不能从脚本访问持久变量?我应该如何编写脚本以使其能够运行?

cmd
帮助启动时<代码>设置/?特定区域指定:

注:1)SETX将变量写入注册表中的主环境

2) 在本地系统上,使用此工具创建或修改的变量 将在以后的命令窗口中可用,但在 当前CMD.exe命令窗口

因此,您需要关闭当前的
cmd
窗口并启动一个新实例,以便从主环境加载新的或修改的环境变量

但是,根据您的注释,您只需要一次性存储环境变量,以便其他脚本访问。因此:

if not defined aa setx aa ABC & exit
echo %aa%
pause
当您第一次运行脚本时,将设置变量并退出,如果变量尚未定义,当您第二次运行脚本时,它将不会设置变量,因为它现在发现变量存在

但是,如果您想在脚本第一次运行时使用变量
%aa%
执行某些操作,则只需设置temp变量即可

if not defined aa setx aa ABC & set aa=ABC
echo %aa%
pause
因此,第一次运行上述程序时,它将在本地和环境中设置一个,但第二次启动时,它将跳过第一行,因为在环境中找到了
%a%

然后,我们还可以查看编辑现有变量:

if not defined aa setx aa ABC & set "aa=ABC"
if not "%aa%" == "NEW_VALUE" setx aa NEW_VALUE & set "aa=NEW_VALUE"
echo %aa%
pause

相同的主体,但现在我们也检查该值,看看它是否包含所需的修改值。

从帮助
cmd
启动时<代码>设置/?特定区域指定:

注:1)SETX将变量写入注册表中的主环境

2) 在本地系统上,使用此工具创建或修改的变量 将在以后的命令窗口中可用,但在 当前CMD.exe命令窗口

因此,您需要关闭当前的
cmd
窗口并启动一个新实例,以便从主环境加载新的或修改的环境变量

但是,根据您的注释,您只需要一次性存储环境变量,以便其他脚本访问。因此:

if not defined aa setx aa ABC & exit
echo %aa%
pause
当您第一次运行脚本时,将设置变量并退出,如果变量尚未定义,当您第二次运行脚本时,它将不会设置变量,因为它现在发现变量存在

但是,如果您想在脚本第一次运行时使用变量
%aa%
执行某些操作,则只需设置temp变量即可

if not defined aa setx aa ABC & set aa=ABC
echo %aa%
pause
因此,第一次运行上述程序时,它将在本地和环境中设置一个,但第二次启动时,它将跳过第一行,因为在环境中找到了
%a%

然后,我们还可以查看编辑现有变量:

if not defined aa setx aa ABC & set "aa=ABC"
if not "%aa%" == "NEW_VALUE" setx aa NEW_VALUE & set "aa=NEW_VALUE"
echo %aa%
pause

相同的主体,但现在我们也检查该值,看看它是否包含所需的修改值。

OK,如何从脚本中“关闭当前cmd窗口并启动新实例”?我刚刚验证了注销并重新登录到Windows将允许脚本显示保存的值(在过去的某个会话中),但这超出了批处理脚本的能力。正确。所以
setx a ABC
然后
exit
并再次打开
cmd
并运行
echo%a%
您不必注销windows,只需关闭
cmd.exe
并再次打开一个。我无法让它工作。听起来你是在告诉我在手动打开的cmd窗口中使用命令,而不是脚本。如果我退出脚本并重新运行它,正如我在开始时所说的那样,那是行不通的。我还试图打开一个辅助批处理文件(“cmd/k EchoValue.bat”),但也无法报告新设置的值。好的,那么您需要将这些值永久存储在环境中的原因是什么?也许我能帮上忙
setx
并不意味着每次运行时都要在脚本中运行以更新环境变量。如何从脚本中“关闭当前cmd窗口并启动新实例”?我刚刚验证了注销并重新登录到Windows将允许脚本显示保存的值(在过去的某个会话中),但这超出了批处理脚本的能力。正确。所以
setx a ABC
然后
exit
并再次打开
cmd
并运行
echo%a%
您不必注销windows,只需关闭
cmd.exe
并再次打开一个。我无法让它工作。听起来你是在告诉我在手动打开的cmd窗口中使用命令,而不是脚本。如果我退出脚本并重新运行它,正如我在开始时所说的那样,那是行不通的。我还试图打开一个辅助批处理文件(“cmd/k echovale.bat”),但它也无法报告新设置的val