我有一个应用程序,它有我无法控制的环境变量,并且是从cmd或explore(或其他任何东西)启动应用程序时所给出的“默认”环境变量进行修改。我的应用程序允许我运行vbscripts,但是这些脚本接受父应用程序的环境变量,这是可以的。我想用vbscript来启动python,使用的是大多数应用程序在从cmd或explorer(或其他任何工具)启动时得到的“normal”/“default”环境变量。我试图使用vbscript调用一个运行python的bat文件,但是python仍在维护其grand-grand父级的环境变量。在
如何让vbscript调用应用程序(python)而不将其“修改的”环境变量传递给它的子对象?{vbi{1>在开始使用vbi}时也尝试过重置它的父脚本,因为它不会使用vbi}重置它的环境。在
我的VBScript如下所示:
sub run
dim wshShell
Set wshShell = CreateObject( "WScript.Shell" )
Dim cmd
cmd = ""
cmd = cmd & chr(34) ' double quote character'
cmd = cmd & "startPython.bat"
cmd = cmd & chr(34)
wshShell.run( cmd )
end sub
我的应用程序将使用修改过的不需要的环境变量来启动run子例程。在
startPython.bat
文件如下所示:
批处理文件不是必需的,但似乎环境链可能会断开,但似乎并非如此。在
最后,我希望vbscript使用“default”/“normal”环境变量来启动python,用户通过cmd或explorer启动新应用程序时会给出这些变量(我不挑剔它们有多旧,或者它们是否是操作系统的启动变量,或者在任何cmd或explorer启动之前在启动过程中稍作修改的变量,或用户启动。这些修改是可以接受的,但是我的父应用程序所做的修改应该会消失。在
(同样重要的是,父级的会话环境变量不发生变化,但是在stackoverflow和其他阅读之后,这似乎很难(而且不推荐)
(我知道它们不是“默认”或“正常”的环境变量集,但存在系统级和用户级,只要我不使用父级应用程序创建的会话变量,在我的情况下这两种情况都可以接受。可接受的解决方案还包括“窃取”一个环境变量的副本,但最好是一组新的操作系统生成的环境变量(系统级或用户级)
理想的解决方案是将vbscript(可选地通过bat文件)限制为使用一组干净的环境变量来启动python。在
编辑其他更新:
根据Harry Johnston的建议:
我尝试通过修改VBScript来使用ShellExecute,使其看起来像:
dim objShell
set objShell = CreateObject("shell.application")
objShell.ShellExecute cmd , "" , "blahBlahBlah"
set objShell = nothing
基于msdn链接建议,但我正在设置一个修改过的环境变量会话。在
(我还从批处理脚本文件中删除了/I然后启动,以防他们获取父会话变量。)
环境变量的Inheritance是Windows的内置概念。但是,任何调用CreateProcess()函数的人都可以为该进程指定环境变量(lpEnvironment)。问题是:如何知道默认的环境变量是什么?在
目前我看到的唯一解决方法是在任务调度器中创建一个任务,并让任务调度器执行命令,而不是您自己的应用程序。这种方法假设任务调度器是从一组原始的环境变量开始的。您需要执行以下命令:
把一切都安排好有点棘手。我不知道这是否有效,但也许你可以试试。在
您需要} 方法。在
shell.application
对象的^{这会导致Windows shell(也称为Windows资源管理器)代表您打开指定的应用程序或文件。这意味着新启动的应用程序将获得一组新的环境变量,就像在资源管理器中双击启动它一样。在
相关问题 更多 >
编程相关推荐