Command line 在vbscript中,如何在当前cmd提示符窗口的环境下运行批处理文件或命令?

Command line 在vbscript中,如何在当前cmd提示符窗口的环境下运行批处理文件或命令?,command-line,vbscript,batch-file,cmd,environment-variables,Command Line,Vbscript,Batch File,Cmd,Environment Variables,在vbscript中,如何在当前cmd提示符窗口中运行批处理文件或命令 没有开始新的过程 比如说。根据script56.chm(vbscript帮助) Windows脚本主机 运行方法(Windows脚本主机) “在新进程中运行程序” 因此,如果我有使用该文件的代码,例如VBS文件和BAT文件。 环境变量g的值为abc g=abc 从命令窗口, VBS文件在windows脚本主机运行时调用BAT文件。 bat过程设置g=z。和完成。。vbs过程完成。 当g=abc时,环境变量保持不变 我知道 C

在vbscript中,如何在当前cmd提示符窗口中运行批处理文件或命令

没有开始新的过程

比如说。根据script56.chm(vbscript帮助) Windows脚本主机
运行方法(Windows脚本主机)
“在新进程中运行程序”

因此,如果我有使用该文件的代码,例如VBS文件和BAT文件。 环境变量g的值为abc g=abc 从命令窗口, VBS文件在windows脚本主机运行时调用BAT文件。 bat过程设置g=z。和完成。。vbs过程完成。 当g=abc时,环境变量保持不变

我知道 CreateObject(“Wscript.Shell”)。运行“c:\test.bat”,0 当使用1而不是0时,启动一个新窗口。(因为0隐藏窗口)

我该怎么办 -在调用vbs的同一cmd环境中,从vbs运行bat文件,这样更改会影响调用它的cmd环境吗? -在当前的两个窗口中,如何从批处理文件访问父cmd窗口的环境

如何在当前cmd提示符窗口中运行批处理文件或命令,而不启动新进程

我认为你不能;vbscript在脚本主机引擎(例如
cscript.exe
wscript.exe
)下运行,批处理文件由命令解释器解释(通常是
cmd.exe
)。这两个文件都是独立的可执行文件,据我所知,它们都不是进程内库,因此无法在同一进程中解释.vbs和.cmd文件。我还高度怀疑运行VBScript的脚本主机引擎是否也可以在其父cmd.exe中运行批处理文件-我认为您无法将新批处理文件“注入”到正在运行的cmd.exe中

如何从批处理文件访问父cmd窗口的环境

不仅仅是访问,还有更改—在这方面非常明确:“在进程创建过程中更改子进程的环境变量是一个进程可以直接更改另一个进程的环境变量的唯一方法。一个进程永远不能直接更改另一个不是该进程子进程的进程的环境变量。”您试图更改父进程的环境,而不是子进程的环境。(不过,我不知道在本文中“直接”是什么意思)

我想这是因为安全性;想象一下,如果任意进程(恶意或意外地)更改正在运行的进程(如vbscript主机引擎进程)的PATH(或COMSPEC)环境变量,可能会造成的破坏——它可能无法完全启动bat文件,从而破坏程序

看起来你运气不好-但是,还有很多其他机制可以在进程之间传递信息。下面是一些在批处理文件和vbscript之间进行讨论时非常容易实现的建议,尽管这些建议并非详尽无遗:

  • 出口代码
  • 写入并解析consoleoutput(标准输出)或临时文件
如果绝对需要在父cmd.exe中设置环境变量(也绝对需要vbscript的中间步骤),则您可能必须编写一个包装批处理文件,该文件运行vbscript,使用vbscript生成的信息,然后设置环境变量;因为包装器cmd是在顶级cmd进程中执行的,所以它将能够在那里更改环境变量


注:请注意,您可以在VBScript中更改永久系统/用户环境变量(与流程环境变量相反),但如果您试图创建瞬态,我不建议您这样做;此外,这不会影响已在运行的流程(如父cmd.exe)无论如何。

这个问题也会被问到,很好,这是一个与相关信息类似的问题。这里最简单的解决方案是不要混合技术。放弃批处理文件,在VBScript中完成所有工作。给出了一个如何编写建议的包装批处理文件的示例。我想添加..因为它是一个调用vbs调用bat的cmd窗口(在它自己的cmd窗口中运行)…这更像是一个子进程和祖辈进程通信或设置彼此的环境变量的问题;-)但我知道..看起来不可能。有趣的是,在您链接到的问题/“解决方案”中,可以看到不同的方法。