在批处理文件中,我可以使用以下示例之一获取控制台窗口的宽度:

Windows console width in environment variable

@echo off
for /F "usebackq tokens=2* delims=: " %%W in (`mode con ^| findstr Columns`) do set CONSOLE_WIDTH=%%W
echo Console is %CONSOLE_WIDTH% characters wide

同样,我想知道当我从命令提示符运行VBscript时如何获取父shell控制台的宽度 . 如果我尝试使用以下命令从VBscript运行上述批处理文件:

CreateObject("WScript.Shell").Run "cmd /k FindWidth.bat"

将打开一个新控制台,FindWidth.bat给出的宽度用于新控制台窗口,而不是父shell的控制台 .

使用VBscript我可以使用以下方法找到父shell的进程ID:In a vbscript, how can i get the process id of the cmd.exe in which the vb script is running . 有没有办法做类似的事情找到它的控制台列宽?也许可以使用其他方法,因为进程ID已知?

编辑更新:

我感谢大家的评论 . 我将尝试添加一些我正在努力完成的更多信息 . 我已经有了一些工作,但我希望有一个更好的解决方案 .

VBscript直接从命令提示符运行 . 不幸的是,VBscript很可能是从wscript.exe运行的,因为这是普通Windows安装的默认设置 . 但我仍然希望将错误消息和其他消息输出到控制台而不是弹出窗口 .

如果我能保证它是用cscript运行的,那就不会有问题 . 使用cscript重新启动VBscript会启动一个新进程,因此来自新运行的csript VBscript的任何消息都将转到新的控制台,而不是原始控制台 .

我有一个有效的解决方案,但它很笨拙,因为它使用与.vbs同名的批处理文件包装,但扩展名为.bat而不是.vbs . 所有批处理脚本都使用cscript运行VBscript . 在本主题中提到:In vbscript, how do I run a batch file or command, with the environment of the current cmd prompt window?我希望找到一种方法来摆脱批处理文件包装,但现在我认为不可能 .

我正在尝试另一种允许使用WScript的解决方法 . 由于可以获取控制台窗口的进程ID,因此可以首先通过以下方式保证将消息激活,从而将消息发送到原始控制台窗口:

objShell.AppActivate(ProcessID)

然后脚本可以立即向原始控制台发送消息:

objShell.SendKeys ":: " & WindowMessage & "{enter}"

诀窍是使用“::”使消息成为不做任何事情的注释 . 这没关系 . 一个小问题是它使控制台窗口使用最后一个命令缓冲区的注释,因此如果用户按下向上箭头或F3等,则注释显示为它们自己键入的命令 . 这很烦人,但因为它只是一个注释,所以不会产生任何错误,也不会产生太大的问题 .

令人讨厌的部分是该消息与普通命令出现在同一行,并且看起来不像是正确的cscript发送消息 . 我想要控制台宽度的原因是通过使用适当数量的空格缓冲消息来格式化消息,使其看起来与从cscript发送的消息相同 . 然后它看起来像真正的stdout输出,除了消息开头的“::” .

该脚本可以只读取命令提示符的默认设置,但在很多情况下不会正确格式化 .

如果我能找到一种方法来使用SendKeys转到新行,并在PROMPT出现之前发送消息,那就会做同样的事情 . 是否有一个可以发送的字符,它会在PROMPT出现之前开始一个新行?

有没有办法使用VBscript将文本消息注入特定控制台窗口的标准输出 . 由于应该获得stdout的控制台已知进程ID,因此wscript VBscript可以静默运行另一个批处理脚本或其他程序,这些程序可以使用进程ID将消息注入原始控制台窗口的stdout .

最终,我想要的是让VBscript文件直接在命令提示符中运行,该命令提示符可以将消息输出到同一个控制台 . 但要正确地做到这一点似乎要求用户键入“cscript scriptname.vbs arguments”而不仅仅是“scriptname arguments”,这应该是怎么回事,但显然不是!使用批处理文件包装器是另一种选择,可以诱使用户直接运行不同的批处理文件而不是VBscript文件 . 我想我需要用真正的计算机语言而不是脚本语言来重做脚本,以使其正常工作 . 我真的不明白为什么用VBscript这么难以实现它看起来应该是微不足道的 .

当WScript根本不允许任何控制台输出时,Windows将VBscript设置为默认使用WScript,这有点令人讨厌 . 但CSCript可以同时执行Windows弹出窗口和控制台输出 . 为什么甚至可以将WScript与CScript区别开来,因为似乎所有事情都可以单独用CScript完成?