子进程是否可以更改或将环境变量传递回父进程?
例如:
我有一个运行一系列访问数据库的批处理文件。一旦数据库完成了它的查询,我想使用 VBA 将一个值传递回批处理文件 - 但我似乎无法让它工作。
我可以使用getEnvironmentVariable
函数读取父变量,但setEnvironmentVariable
似乎不起作用。
子进程是否可以更改或将环境变量传递回父进程?
例如:
我有一个运行一系列访问数据库的批处理文件。一旦数据库完成了它的查询,我想使用 VBA 将一个值传递回批处理文件 - 但我似乎无法让它工作。
我可以使用getEnvironmentVariable
函数读取父变量,但setEnvironmentVariable
似乎不起作用。
您的 vba 将拥有自己的调用它的批处理环境的副本。您可以在本地副本中设置一个值,但是一旦 vba 将控制权返回给您的批处理脚本,它就会消失。所以答案是否定的,你不能直接做你想做的事。
你想做的是一个共同的需求。一种解决方案是将值写入临时文件,然后让父批处理脚本读取值并删除临时文件。
如果您的 vba 可以写入标准输出,您可以避免使用临时文件 - 我假设您可以,但我不确定。您的批处理脚本可以通过 FOR /F 调用您的数据库并处理标准输出输出。FOR /F 如何解析输出有很多选择。
一般语法是:
for /f "options" %%A in ('yourCommand') do (REM process values using %%A)
在命令提示符下键入HELP FOR
或FOR /?
以获取有关 FOR 命令的完整帮助。
您可以从 vba 执行 cmd 命令,因此要设置可以使用的环境变量:
Dim cmd_str
cmd_str = "setx env_var_name env_var_value"
Call Shell(cmd_str, vbNormalFocus)
请注意,这将为当前用户创建/设置环境变量,可以添加 /M 参数以使该系统范围广,但 cmd 必须以管理员身份运行才能正常工作。
vbNormalFocus 选项将允许命令提示出现,然后在片刻后消失,如果您不想看到它,请改用 vbHide。