通过vbscript或bat文件调用python启动新进程时获取未修改的环境变量

2024-09-24 04:24:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序,它有我无法控制的环境变量,并且是从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文件如下所示:

^{pr2}$

批处理文件不是必需的,但似乎环境链可能会断开,但似乎并非如此。在

最后,我希望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然后启动,以防他们获取父会话变量。)


Tags: 文件run用户脚本cmd应用程序环境变量normal
2条回答

环境变量的Inheritance是Windows的内置概念。但是,任何调用CreateProcess()函数的人都可以为该进程指定环境变量(lpEnvironment)。问题是:如何知道默认的环境变量是什么?在

目前我看到的唯一解决方法是在任务调度器中创建一个任务,并让任务调度器执行命令,而不是您自己的应用程序。这种方法假设任务调度器是从一组原始的环境变量开始的。您需要执行以下命令:

schtasks /create ...
schtasks /run ...
schtasks /delete ...

把一切都安排好有点棘手。我不知道这是否有效,但也许你可以试试。在

您需要shell.application对象的^{}方法。在

这会导致Windows shell(也称为Windows资源管理器)代表您打开指定的应用程序或文件。这意味着新启动的应用程序将获得一组新的环境变量,就像在资源管理器中双击启动它一样。在

相关问题 更多 >