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 批启动持久化特定变量_Batch File_Dos - Fatal编程技术网

Batch file 批启动持久化特定变量

Batch file 批启动持久化特定变量,batch-file,dos,Batch File,Dos,我有一个.bat,它有一个变量%errorlevel%,下面一行调用b.bat: start /wait cmd /c b.bat 如果b.bat设置%errorlevel%(例如errorlevel=5) 我如何能够在不使用CALL命令的情况下在a.bat中仅保留此%errorlevel%变量 我不想使用CALL的原因是因为b.bat包含一些我不想保留的变量。您不必公开内部变量来在脚本之间进行通信。您可以使用常规参数向被调用的脚本发送值,并从%ERRORLEVEL%环境变量获取其数值结果。在

我有一个.bat,它有一个变量
%errorlevel%
,下面一行调用b.bat:

start /wait cmd /c b.bat
如果
b.bat
设置
%errorlevel%
(例如
errorlevel=5

我如何能够在不使用CALL命令的情况下在
a.bat
中仅保留此
%errorlevel%
变量


我不想使用CALL的原因是因为
b.bat
包含一些我不想保留的变量。

您不必公开内部变量来在脚本之间进行通信。您可以使用常规参数向被调用的脚本发送值,并从
%ERRORLEVEL%
环境变量获取其数值结果。在以下示例中,
a.cmd
将参数传递给
b.cmd
,并接收其执行结果(从
%ERRORLEVEL%
):

我强调避免为变量使用保留名称的建议(正如@dbenham也评论的那样)。

这个答案自最初发布以来已被大量编辑

您的命令应该按照当前编写的方式工作,尽管我不认为使用START有任何好处。简单地使用以下各项会更简单、更有效:

cmd /c "b.bat"
CMD命令应返回由b.bat设置的ERRORLEVEL。当然,如果您创建了自己的名为ERRORLEVEL的环境变量来屏蔽Windows维护的动态值,那么这将不起作用

但是,我认为最好(如果可能的话)修改b.bat,使其顶部有
SETLOCAL
。任何由b.bat定义的变量都是临时的,一旦脚本结束就会被遗忘。然后您可以使用CALL,并且b.bat中的变量将消失,但是会为调用者正确设置ERRORLEVEL

b.bat

@echo off
setlocal
set var=This value will be "forgotten" when b.bat ends
dir "This does not exist so ERRORLEVEL will be set to 1"
@echo off
set var=
call b.bat
echo ERRORLEVEL=%errorlevel%
set var
caller.bat

@echo off
setlocal
set var=This value will be "forgotten" when b.bat ends
dir "This does not exist so ERRORLEVEL will be set to 1"
@echo off
set var=
call b.bat
echo ERRORLEVEL=%errorlevel%
set var
但是根据你的评论,听起来好像你在b.bat中有一行,如下所示:

set errorlelvel=%errorsaved%
您不应该像那样为ERRORLEVEL定义自己的值,因为它破坏了ERRORLEVEL应该用于的功能

相反,您应该使用EXIT/B在脚本末尾设置errorlevel

@echo off
setlocal
...
set someVar=anything. This value will be gone at script end because of SETLOCAL
...
someCommandThatGeneratesAnError
set errorsaved=%errorlevel%
...
exit /b %errosaved%


如果您试图有选择地从b.bat(而不是ERRORLEVEL)中持久化用户定义的变量,那么您确实应该修改b.bat,使其顶部有
SETLOCAL
,然后使用
ENDLOCAL
结合多种方法中的任何一种来持久化ENDLOCAL屏障上的值。看一看投票选出的前三名答案

嗨,谢谢你的回复。我真正想要的是在b.cmd中更改%OTHERVAR%,并在a.cmddbenham中输出该值。感谢dbenham,我实际上希望持久化ERRORLEVEL。所以b.bat实际上是通过sqlcmd调用了两个查询。所以我想在这里我应该用你的例子(和CALL)对吗?(而且它对START不起作用)@MajorInc-你可以将START与我的第一个建议结合使用,但没有任何好处。直接使用CMD更有效。我仍然更喜欢调用b.bat的修改形式。你知道吗,我认为实际上像start/wait cmd/c b.bat这样简单的东西可以工作。正如您所说,ERRORLEVEL是一个环境变量,因此是持久性。我认为我面临的问题可能是由caller.bat中的“set errorlevel=%errorsaved%”行引起的:/