目前,大约有 20 到 30 台计算机,我定期拨入。我目前在 Windows XP SP3 上使用超级终端来执行此操作。一旦我的计算机连接到另一台计算机,我会得到一些信息的字符串打印输出,我手动查看这些信息并输入到 Excel 中。
虽然它适用于手动连接,但这是一个乏味的过程,我觉得应该自动化。我现在每周做一次,因为它非常费力(通常每次 30-40 分钟),但理想情况下我希望它每天都作为计划任务运行。但是,超级终端似乎不提供任何脚本功能。此外,我尝试使用会话记录功能,但它似乎并没有那么可靠地工作。
是否有某种方法(可能使用批处理或 VBS 或 PowerShell 脚本)可以顺序拨打一系列计算机,然后自动将终端输出记录到带有时间戳的文本文件中?
另外需要注意的是,我还需要能够处理异常,例如,如果计算机很忙。超级终端具有“忙时重拨”功能,有时我会使用该功能或拨打其余计算机,然后再回到那台计算机。我还需要将其构建到我的脚本中。
考虑到战争拨号是可能的,虽然它没有记录输出,只有载波音的缺失或存在,我觉得这是可以实现的。我该如何实施呢?
如果可能,我需要 Batch 或 VBS 解决方案。我不确定 Windows XP 上的 PowerShell 支持有多好,出于各种原因,我不想在机器上安装任何其他工具(例如 Python 等)。
澄清:我有一个朋友曾经编写了一个脚本,可以使用 Hayes 命令拨出到线路上。这是容易的部分;困难的部分是能够检测远程计算机的打印输出并将其记录到文本文件中。
超级终端的付费版本提供了按照这些思路编写脚本的功能,但我想通过使用自定义脚本免费执行此操作,并且还能够处理繁忙的号码。
谢谢!
电源外壳
这是我尝试过的脚本:
# Create your instance of the SerialPort Class
$serialPort = new-Object System.IO.Ports.SerialPort
# Set various COM-port settings
$serialPort.PortName = "COM3"
$serialPort.BaudRate = 1200
$serialPort.WriteTimeout = 500
$serialPort.ReadTimeout = 23000
$serialPort.DtrEnable = "true"
# or in one command
# $serialPort= new-Object System.IO.Ports.SerialPort COM#,Baudrate,None,8,one
# Open the connection
$serialPort.Open()
# write to it
$serialPort.WriteLine( "at+csq" + "`r" )
$serialPort.WriteLine( "atdt1NPANXXXXXX" + "`r" )
# wait
start-sleep -m 50
# read line
$line = $serialPort.ReadLine()
Write-Host $line
# write to it
$serialPort.Close()
迄今为止最接近的解决方案:
我能得到的最接近的是使用 AHK,它非常挑剔,但工作时间足够有用。我的计划是将它连接到一个批处理脚本并传入每个数字并迭代,直到我成功地从每台计算机上获得打印输出。
可以帮助您解决问题的工具是 AT Command Tester Desktop App,这是一款商业产品(9.95 美元),可免费试用 7 天。
该产品可以在其“脚本模式”选项卡下执行 AT 命令脚本,在此可以从本地计算机保存和加载脚本。
它还具有命令行模式,可以通过以下方式调用它:
该工具还可以收集和保存调制解调器日志。我没有尝试过,因为我没有调制解调器或不知道要拨打的号码,但是如果将日志保存为文本文件,那么编写一个用于错误/成功的小文本搜索脚本应该是一件简单的事情。
如果您更喜欢自己编写,一个简单的 PowerShell 脚本可以使用 System.IO.Ports.SerialPort 类来完成。
这是一个示例(未经测试且非常理论化):
请注意,调制解调器使用的行尾字符需要注意。
这是我在安装了 .Net Framework 2.0 和 KB968930的 XP VM 上的会话。它几乎工作了,除了没有任何东西连接到 COM1,所以它挂在 ReadLine() 调用上,直到超时结束。
请注意,我的脚本中存在复制粘贴错误,现已更正。行不通的是:
它应该是:
控制调制解调器的最基本方法是通过串行端口发送命令。几乎所有拨号调制解调器都支持Hayes AT 命令,例如
ATD
或ATH
(通常在串行调制解调器的硬件中,有时由 USB/PCI 调制解调器的驱动程序模拟)。例子:
Linux/OpenBSD/FreeBSD:所有程序和库最终都使用
/dev/ttyS*
特殊文件来访问串行端口。(注意:在 Linux 上,USB 串行适配器被命名为 ttyUSB 或 ttyACM。)在大多数情况下,您的程序可以像打开常规文件一样打开路径,然后写入/刷新命令并读取响应。
Windows:所有程序最终都使用
\\.\COM1:
特殊文件来访问串行端口。前四个可以简单地打开COM1:
(快捷方式是 MS-DOS 遗物)。PowerShell:有一个关于这个主题的DevBlog 。
Python:使用pySerial。
在 Windows 上,另一种方法可能是使用Telephony API。但是,我找不到它是否支持数据(终端)呼叫,还是仅支持语音呼叫。
作为旁注:这里只是我用来控制我的调制解调器的两个实用程序。我发送和接收大量短信,这些工具就是为此而生的。它们支持多个调制解调器,并且 AT 命令用于初始化调制解调器。尽管所有功能都以某种方式与 SMS 一起使用,但它可以使用 init 脚本等进行高度定制。我还没有测试过一个完整的周期,比如拨入另一个调制解调器并以某种方式接收数据,但也许值得看看它们:
http://smstools3.kekekasvi.com/index.php https://wammu.eu/smsd/
AutoHotkey.com 会很有帮助。
我相信让它可靠工作的一个关键技巧是使用正确的方法。简单地将击键转储到 Microsoft Windows 以便 Windows 将其提供给前台应用程序并不是最稳定的方法。这是我用来与 PuTTY 交互的一些代码。它运行良好,我可以启动脚本,该脚本将启动 PuTTY,但即使 PuTTY 在后台,程序也可以与正确的 PuTTY 实例交互。
(您可能希望显着修改此示例代码。)
不一定有令人信服的理由为什么我仍然将事情分解成碎片,多次调用“IfWinExist”。当我创建和最初调试脚本时,我发现如果远程端终止连接(这会导致我的 PuTTY 窗口关闭),它对调试很有用(或者至少感觉我对正在发生的事情有更好的了解) .
主要的是,通过使用 ControlSend 使用我的 Run 命令创建的 PID 向程序提供击键,如果发生了不好的事情,脚本不会继续尝试向 Windows 发送击键并最终获得击键进入错误的程序。