我正在混合使用 VbScript 和 CMD,我可以轻松调用 VBScript
cscript.exe //NoLogo "%~dp0TASK.vbs" >>"%~dp0output.txt"
但是我需要禁用用户点击VBScript调用各种错误的功能,而不是通过批处理文件调用。
我的第一次尝试是在运行 cscript.exe
之前将变量设置到文本文件中,并在 VBScript 中使用错误处理来判断是否可以收集该变量,但它添加了太多脚本的时间。
VBScript 是否有办法判断它是由 CMD 启动的,还是通过双击启动的,并能够相应地执行操作?
最佳答案
这是一个简单的函数,检测父进程标题。您可以检查该进程是否由 CMD shell(标题为 cmd.exe
)或双击(explorer.exe
)启动:
If LCase(GetParentProcessCaption()) <> "cmd.exe" Then WScript.Quit
' the rest part of your code here
Function GetParentProcessCaption()
With GetObject("winmgmts:\\.\root\CIMV2:Win32_Process.Handle='" & CreateObject("WScript.Shell").Exec("rundll32 kernel32,Sleep").ProcessId & "'")
With GetObject("winmgmts:\\.\root\CIMV2:Win32_Process.Handle='" & .ParentProcessId & "'")
With GetObject("winmgmts:\\.\root\CIMV2:Win32_Process.Handle='" & .ParentProcessId & "'")
GetParentProcessCaption = .Caption
End With
End With
.Terminate
End With
End Function
在您的问题的上下文中,允许将参数从 CMD shell 进程传递到 WSH 脚本子进程的另一种方法可能会有用。它使用环境变量和 WScript.Shell
对象。考虑以下示例。
task.cmd
文件的代码:
set myvar=myvalue
wscript "%~dp0task.vbs"
对于 task.vbs
文件:
WScript.Echo CreateObject("WScript.Shell").Environment("process").Item("myvar")
我得到的输出如下:
请注意,只有子进程可以访问进程环境变量。
关于batch-file - 如何防止 VBScript 独立运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34318670/