在一个批处理文件中创建的变量是否可以在另一个批处

时间:2014-03-09 19:18:21

标签: windows batch-file

我有一些批处理文件,我正在尝试更好地组织,通常试图将它带到一个地方,在那里他们可能会更容易被最近路上的人工作。

在执行此操作时,我发现我不知道批处理脚本是否会将变量保留在内存中。这是我的一个例子:

SET SQLSERVER="TestServer1"
SET SQLTEXT="select * from some_table"
IF NOT %SQLSERVER% = ""
    CALL RUNSQL.BAT
END IF

RUNSQL.BAT我有类似的内容:

SET SQLCMD="C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE"
%SQLCMD% -S %SQLSERVER% -Q %SQLTEXT"
EXIT

我的问题是:在第一位文本中设置的变量是否会持续到RUNSQL.BAT

1 个答案:

答案 0 :(得分:1)

环境变量存储在每个进程的内存空间中的内存块中。每次启动进程时,子进程都会获得父进程环境的副本,因此在启动时都看到相同的数据,但不共享相同的变量,child有一个COPY。在孩子的环境中看不到父母环境的任何变化。在父母的环境中看不到孩子的环境的任何变化。

在批处理文件中,如果两个脚本都在同一个cmd实例中运行,则两者都共享相同的变量,即运行这两个批处理文件的cmd.exe进程的环境内存中的那些。

在发布的示例代码中,cmd.exe正在运行第一个批处理脚本,并且它在同一个cmd内调用第二个批处理脚本,该脚本在同一cmd实例中运行,因此,两者都共享相同的环境变量。第二批看到相同的变量,第二批中的任何更改都会在通话结束时看到。