
現在、定期的にダイヤルインするコンピュータは 20 ~ 30 台ほどあります。この作業には、現在 Windows XP SP3 のハイパーターミナルを使用しています。自分のコンピュータが他のコンピュータに接続されると、いくつかの情報の文字列がプリントアウトされるので、それを手作業で目視して Excel に入力します。
手動接続ではうまく機能しますが、面倒なプロセスなので自動化すべきだと思います。非常に手間がかかるため (通常 1 回あたり 30 ~ 40 分)、現在は週に 1 回実行していますが、理想的にはスケジュールされたタスクとして毎日実行したいです。ただし、ハイパーターミナルにはスクリプト機能がないようです。さらに、セッション ログ機能を使用してみましたが、それほど確実に機能しないようです。
バッチや VBS、PowerShell スクリプトなどを使用して、一連のコンピューターに順番にダイヤルし、端末出力をタイムスタンプ付きでテキスト ファイルに自動的に記録する方法はありますか?
追加の注意点は、コンピュータがビジー状態の場合など、例外も処理できる必要があることです。ハイパーターミナルには「ビジー時にリダイヤル」機能があり、それを使用したり、残りのコンピュータにダイヤルしてからそのコンピュータに戻ったりすることがあります。スクリプトにその機能も組み込む必要があります。
ウォーダイヤリングは可能だが、出力は記録されず、キャリアトーンの有無のみが記録されるので、これは実現可能だと感じます。これを実装するにはどうすればよいでしょうか?
可能であれば、バッチまたは VBS ソリューションが必要です。Windows XP での PowerShell サポートがどの程度優れているかはわかりませんが、さまざまな理由から、マシンに追加のツール (Python など) をインストールしたくありません。
説明:友人が、かつてヘイズ コマンドを使用して回線にダイヤルアウトできるスクリプトを作成したことがあります。これは簡単な部分ですが、難しいのは、リモート コンピューターからのプリントアウトを検出して、それをテキスト ファイルに記録できることです。
有料版の HyperTerminal には、このようなスクリプトを作成する機能が用意されていますが、私は、話し中の番号も処理できるカスタム スクリプトを使用して、これを無料で実行したいと考えています。
ありがとう!
パワーシェル
PowerShell スクリプトを実行すると、次の結果が得られます。
私が試したスクリプトは次のとおりです:
# 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 を使うことです。これはかなり扱いにくいですが、役に立つほどには十分に機能します。私の計画は、バッチ スクリプトを接続して各数値を渡し、各コンピューターから正常にプリントアウトされるまで繰り返し処理することです。
答え1
AutoHotkey.com が役に立つかもしれません。
確実に動作させるための重要なコツは、正しいアプローチを使用することだと考えています。Microsoft Windows にキーストロークをダンプして、Windows がそれをフォアグラウンド アプリケーションに渡すだけでは、最も安定した方法とは言えません。以下は、PuTTY と対話するために使用したコードの一部です。このコードは十分に機能し、スクリプトを開始して PuTTY を起動することができ、その後、PuTTY がバックグラウンドにある場合でも、プログラムは PuTTY の正しいインスタンスと対話できました。
(おそらく、このサンプル コードを大幅に変更することになるでしょう。)
sPuTTYloc:="C:\Users\\me\PuTTY\PuTTY.exe"
sSiteName:="NameOfSite"
Run, "%sPuTTYloc%" -load "%sSiteName%",,UseErrorLevel,sPuTTYPID
if %sPuTTYPID%
{
WinWait, ahk_pid %sPuTTYPID%
sleep ,5000
IfWinExist,ahk_pid %sPuTTYPID%
{
ControlSend,,{Enter},ahk_pid %sPuTTYPID%
; other stuff
else
{
MsgBox "PuTTY Window closed, spot #1"
return ; Apparently the PuTTY window closed
}
Sleep 1500
IfWinExist,ahk_pid %sPuTTYPID%
{
; do other stuff
}
else
{
MsgBox "PuTTY Window closed, spot #2"
return ; Apparently the PuTTY window closed
}
Sleep 1500
return
}
return
依然として「IfWinExist」を複数回呼び出して、処理を細分化している理由は、必ずしも説得力のあるものではありません。スクリプトを作成して最初にデバッグしていたとき、リモート側が接続を終了すると (PuTTY ウィンドウが閉じる)、デバッグに役立つ (または少なくとも何が起こっているかをよりよく理解できる) ことがわかりました。
重要なのは、ControlSend を使用して、Run コマンドによって作成された PID を使用するプログラムにキーストロークを与えることで、何か問題が発生した場合でも、スクリプトが Windows にキーストロークを送信し続けず、キーストロークが間違ったプログラムに送信されてしまうことがなくなることです。
答え2
あなたの問題を解決するのに役立つツールは AT コマンド テスター デスクトップ アプリ、7 日間の無料試用期間付きの商用製品 (9.95 ドル)。
この製品は、「スクリプト モード」タブで AT コマンドのスクリプトを実行でき、スクリプトをローカル コンピューターに保存したり、ローカル コンピューターから読み込むことができます。
また、次のように呼び出すことができるコマンド ライン モードもあります。
atc –port portname –script filename
このツールはモデムのログを収集して保存することもできます。モデムを持っていないし、電話番号も知らないので試していませんが、ログがテキスト ファイルとして保存されていれば、エラー/成功を検索する小さなテキスト検索スクリプトを書くのは簡単なはずです。
自分で書きたい場合は、簡単なPowerShellスクリプトで実行できます。 System.IO.Ports.SerialPort クラス。
ここに例を示します (テストされておらず、非常に理論的なものです)。
# Create your instance of the SerialPort Class
$serialPort = new-Object System.IO.Ports.SerialPort
# Set various COM-port settings
$serialPort.PortName = "COM1"
$serialPort.BaudRate = 19200
$serialPort.WriteTimeout = 500
$serialPort.ReadTimeout = 3000
$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" )
# wait
start-sleep -m 50
# read line
$line = $serialPort.ReadLine()
Write-Host $line
# write to it
$serialPort.Close()
モデムで使用される行末文字には注意が必要であることに注意してください。
これは、.Net Framework 2.0をインストールしたXP VMでのセッションです。 KB968930ほぼ動作しましたが、COM1 に何も接続されていないため、タイムアウトによって終了するまで ReadLine() 呼び出しでハングしました。
私のスクリプトにはコピー アンド ペースト エラーがありましたが、現在は修正されています。機能しなかった行は次のとおりです。
$line = $port.ReadLine()
正しくは次のようになります:
$line = $serialPort.ReadLine()
答え3
モデムを制御する最も基本的な方法は、シリアルポートを介してコマンドを送信することです。ほぼすべてのダイヤルアップモデムは、ヘイズATコマンドまたは などATD
(ATH
通常はシリアル モデムのハードウェアで、USB/PCI モデムのドライバーによってエミュレートされる場合もあります)。
例:
Linux/OpenBSD/FreeBSD: すべてのプログラムとライブラリは、最終的には
/dev/ttyS*
特殊ファイルを使用してシリアル ポートにアクセスします。(注: Linux では、USB シリアル アダプタの名前は ttyUSB または ttyACM です。)
ほとんどの場合、プログラムはパスを通常のファイルのように開き、コマンドを書き込んだりフラッシュしたりして、応答を読み取ることができます。Windows: すべてのプログラムは、最終的には
\\.\COM1:
特別なファイルを使用してシリアル ポートにアクセスします。最初の 4 つは、次のように簡単に開くことができますCOM1:
(ショートカットは MS-DOS の遺物です)。PowerShell:開発ブログこのトピックにおいて。
Python: 使用pySerial。
Windowsの場合、もう1つの方法は、テレフォニー APIただし、データ(端末)通話に対応しているのか、音声通話のみに対応しているのかはわかりません。
答え4
補足として、モデムを制御するために私が使用しているユーティリティを 2 つ紹介します。私は SMS を頻繁に送受信するため、このツールはそのために作られています。複数のモデムをサポートし、モデムの初期化には AT コマンドを使用します。すべての機能は SMS で動作するようにレイアウトされていますが、init スクリプトなどを使用して高度にカスタマイズできます。別のモデムにダイヤルインして何らかの方法でデータを受信するような完全なサイクルをテストしたことはありません。しかし、調べてみる価値はあるかもしれません。
http://smstools3.kekekasvi.com/index.php https://wammu.eu/smsd/