windows - 使用 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
解决方案
将我的评论转换为答案,即使我仍然有点困惑你实际上在追求什么,但希望它会在下面介绍......
对于它的价值,我的理解是 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
我猜您也可以将声明放在那里)。我不明白如果你没有加载“附加”插件,为什么你会失去绘图功能(除非你指的是我上面提到的二进制文件之间的区别octave
)octave-cli
。只要不需要专门启动,那么您应该可以随时在八度范围内设置环境变量而不会出现问题。
推荐阅读
- android - Android 7 + - 堆栈 #0 与堆栈 #1
- elasticsearch - Elasticsearch - 使用新索引名称的模式重新索引整个集群
- zoneddatetime - “ZonedDateTime 未定义错误”是一个错误吗?
- firebase - Firestore 规则:已达到最多 1000 个要评估的表达式
- node.js - 文件上传完成后node.js内存不足
- javascript - 当网格上方的内容被隐藏时,如何向上滑动网格?
- javascript - 不使用 jQuery 以编程方式控制 Select2
- python - 从提交中获取 GitHub 存储库 URL
- r - 使用 lapply 在函数内设置数据框名称
- angular - 如果我想从编辑中禁用特定行,但不在 ng2 智能表中显示编辑/删除按钮怎么办