首页 > 解决方案 > 使用 VBS (Windows) 在当前 shell 中打开可执行文件

问题描述

我一直在搜索 2005 年前的各种论坛,试图找出如何使用 VBS 在当前 shell 中运行基于 shell 的应用程序。即,我已经打开了一个终端,并且想要执行这个应用程序(它进入一个 REPL)并使用我所在的终端来使用它 - 相反,一个新的命令提示符正在打开,这违背了我的想法的目的此应用程序的无 gui(纯)REPL 版本。这个应用程序是 GNU Octave。

对于他们的 Windows 安装,他们有一个 VBS 脚本(基于 CLI arg)打开 Octave Dev 环境或仅打开 Octave REPL(使用--no-gui)。他们通过 VBS 脚本(见下文)执行此操作,所以我想,也许我可以修改它以使其在当前 shell 中打开 Octave REPL。事实证明这并不像我想象的那么容易......我发现我的问题的罪魁祸首是wshShell.Run命令,但显然它只能在后台运行命令,或者作为一个新进程 - 要清楚,我想在当前进程中运行我的应用程序。

我想这是一个简单问题的很多前言:我如何(少量)修改以下文件以交互方式打开 Octave REPL,同时保持所有环境变量和它设置的其他设置?


' script to run octave in gui/command mode

Set wshShell = CreateObject( "WScript.Shell" )

' get the directory that script resides in
Set fso = CreateObject("Scripting.FileSystemObject")
OctavePath = fso.GetParentFolderName(WScript.ScriptFullName)

' ctavePath is now the root of the install folder, but for msys2,
' OctavePath should be OctavePath/mingw64 or OctavePath/ming32
MSysType = "MSYS"
MSysPath = OctavePath
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(OctavePath & "\mingw64\bin\octave-cli.exe") Then
  MSysPath = OctavePath & "\usr"
  MSysType = "MINGW64"
  OctavePath = OctavePath & "\mingw64" 
 ElseIf objFSO.FileExists(OctavePath & "\mingw32\bin\octave-cli.exe") Then
  MSysPath = OctavePath & "\usr"
  MSysType = "MINGW32"
  OctavePath = OctavePath & "\mingw32" 
End If

' get path as a 8.3 path
Set fo = fso.GetFolder(OctavePath)
OctavePath = fo.ShortPath
Set fo = Nothing

' set up path to ensure octave bin comes first
Set wshSystemEnv = wshShell.Environment( "PROCESS" )
if OctavePath <> MSysPath Then
  wshSystemEnv("PATH") = MSysPath  & "\bin;" & wshSystemEnv("PATH")
End If
wshSystemEnv("PATH") = OctavePath & "\bin;" & wshSystemEnv("PATH")

wshSystemEnv("MSYSTEM") = MSysType

' set terminal type
wshSystemEnv("TERM") = "cygwin"
wshSystemEnv("GNUTERM") = "wxt"

wshSystemEnv("GS") = "gs.exe"

If wshShell.ExpandEnvironmentStrings("%HOME%") = "%HOME%" Then
  Home = wshSystemEnv("USERPROFILE")
  Set fo = fso.GetFolder(Home)
  wshSystemEnv("HOME") = fo.ShortPath
  Set fo = Nothing
End If

' set Qt plugin directory and path 
If objFSO.FolderExists(OctavePath & "\qt5\bin") Then
  wshSystemEnv("PATH") = OctavePath & "\qt5\bin;" & wshSystemEnv("PATH")
  wshSystemEnv("QT_PLUGIN_PATH") = OctavePath & "\qt5\plugins"
Else
  wshSystemEnv("QT_PLUGIN_PATH") = OctavePath & "\plugins"
End If

' check args to see if told to run gui or command line
' and build other args to use
GUI_MODE=1
AllArgs = ""
Set wshArgs = WScript.Arguments
For I = 0 to wshArgs.Count - 1
  If wshArgs(I) = "--no-gui" Then GUI_MODE=0
  AllArgs = AllArgs & " " & chr(34) & wshArgs(I) & chr(34)
Next

' start octave-gui, either with console shown or hidden
If GUI_MODE = 1 then
  AllArgs = AllArgs & " " & chr(34) & "--gui" & chr(34)
  wshShell.Run chr(34) & OctavePath & "\bin\octave-gui.exe" & Chr(34) & AllArgs, 0
Else
  wshShell.Run chr(34) & OctavePath & "\bin\octave-gui.exe" & Chr(34) & AllArgs, 1
End If

' free our objects
Set fso = Nothing
Set wshShell = Nothing
Set wshSystemEnv = Nothing
Set wshArgs = Nothing

标签: windowsshellvbscriptoctavegnu

解决方案


将我的评论转换为答案,即使我仍然有点困惑你实际上在追求什么,但希望它会在下面介绍......

对于它的价值,我的理解是 vbs 脚本基本上是实际 octave 二进制文件的包装器,它应该安装在您的 octave 根目录的 bin 文件夹中。因此,启动 repl 应该像将该目录放在您的路径中并在控制台中输入 octave 一样简单。

我不知道 windows 二进制文件是否有更多差异,但在 linux 二进制文件中,你有 octave 和 octave-cli,后者:

octave-cli 在没有任何 GUI 支持 (Qt) 的情况下进行编译,这使得它比默认的 octave 可执行文件小,但也将其限制为仅提供命令行界面 (CLI)。

正如您所说,一个关键的区别是它缺少 qt 库。如果您尝试在 cli 环境中绘图,您仍然会得到图形窗口,但它们将使用 fltk 或 gnuplot 环境而不是 qt。

但除此之外,您完全可以使用octave支持 qt 的普通可执行文件,并在 REPL (ie --no-gui) 模式下使用它而不是完整的 gui。事实上,至少在 linux 中,据我所知,这是默认行为;您需要显式传递--gui选项以启动实际的 gui。也许开发人员觉得 Windows 人群可能会感到困惑,所以他们扭转了这种行为并创建了octave-gui可执行octave文件,后者本质上是精简的 cli 版本;我不知道。如果是这种情况,我假设您可以使用octave-gui可执行文件并传递某种选项(大概--no-gui或类似的东西)在控制台中运行它,但仍然具有对绘图等的完整 qt 支持。

关于将一堆您感兴趣的不相关的环境变量加载到您的会话中,没有什么可以阻止您从 octave 中加载这些变量(例如使用setenv)。同样,如果您希望在启动时预定义普通的“八度”变量,您可以将它们放入您的 .octaverc 文件中(setenv我猜您也可以将声明放在那里)。我不明白如果你没有加载“附加”插件,为什么你会失去绘图功能(除非你指的是我上面提到的二进制文件之间的区别octaveoctave-cli。只要不需要专门启动,那么您应该可以随时在八度范围内设置环境变量而不会出现问题。


推荐阅读