ネットワークからのマシン名のリストがあり、バッチファイルに入れてリストを実行し、それぞれにログオンしているユーザーを表示します。
psloggedon \\machineA
psloggedon \\machineB
psloggedon \\machineC
psloggedon \\machineD
psloggedon \\machineE
psloggedon \\machineF
...
Psloggedonは正常に動作しますが、実際にはネットワーク上にないマシンにヒットすると、次のマシンに移動する前に30〜60秒間ハングします...これを高速化する方法があるかどうか疑問に思っていました。ネットワーク上にないマシンにヒットした場合、リスト内の次のマシンにはるかに速く移動します。
コマンドにping-nループを追加することでこれが可能になる可能性があることを他の場所で読んだことがありますが、どうすればよいでしょうか。
Dosでそれを行う方法がわかりません。 Autoitを使用して「クリア」リストを取得できます。 http://www.autoitscript.com
Autoitをインストールすると、このスクリプトを使用できます。最新のpsloggedon.exe(1.34)を使用する必要があります
スクリプトを「NAME.au3」(任意の名前)ファイルとして保存します。
例:
c:\ NAME.au3
c:\ pclist.txt
c:\ pstools\psloggedon.exe
#include <Constants.au3>
Dim $line, $line2, $file, $icount, $reg, $reg2, $reg3
$file = FileOpen("pclist.txt", 0)
While 1
$line = FileReadLine($file)
If @error Then ExitLoop
$reg3 = ""
$reg2 = ""
$reg = ""
If Ping($line, 200) Then
$reg = @ComSpec & ' /C "' & @ScriptDir & "\pstools\psloggedon.exe -l -x \\" & $line & '"'
$reg = Run($reg, "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
While 1
$reg2 = StdoutRead($reg)
If @error Then ExitLoop
If $reg2 Then
$reg3 &= $reg2
EndIf
WEnd
If StringInStr($reg3, "Error") Then
$reg = "Error"
ElseIf StringInStr($reg3,"No one is logged") Then
$reg = "No one is logged on locally."
Else
$reg = StringTrimLeft($reg3, StringInStr($reg3, Chr(13), "", 3))
$reg = StringTrimLeft($reg, StringInStr($reg, "\"))
$reg = StringTrimRight($reg, StringLen($reg) - StringInStr($reg, Chr(13)))
$reg = StringStripWS($reg, 8)
EndIf
$icount += 1
$line2 &= $icount & @TAB & $line & @TAB & $reg & @CRLF
EndIf
TrayTip("Psloggedon", $icount & " " & $line & " User: " & $reg, 10)
WEnd
FileClose($file)
ConsoleWrite($line2)
FileDelete("C:\output.txt")
FileWrite("C:\output.txt", $line2)
ShellExecute("C:\output.txt")
あなたの場合、pingコマンドを使用するのが正しいでしょう。
Start.cmd
FOR /F %%x in (c:\temp\pclist.txt) do call ping_psloggedon.cmd %%x
ping_psloggedon.cmd
ping -n 1 -i 200 -w 130 %1
if errorlevel 1 goto exit
c:\temp\pstools\psloggedon.exe \\%1
:exit
pclist.txt
PCNAME1
PCNAME2
PCNAME3
>> c:\ outputをc:\ temp\pstools\psloggedon.exe \%1に追加するだけです
ping -n 1 -i 200 -w 130 %1
if errorlevel 1 goto exit
c:\temp\pstools\psloggedon.exe \\%1 >> C:\output.txt
:exit
これで、start.cmdを開始するたびに、結果がc:\ output.txtに追加されます。
必要に応じて、echo LoggedonUsers> c:\ output.txtをstart.cmdに追加して、開始時にクリーンなoutput.txtを取得できます。
echo LoggedonUsers > c:\output.txt
FOR /F %%x in (c:\temp\pclist.txt) do call ping_psloggedon.cmd %%x
「これもERRORLEVELステートメントでしょうか?」とはどういう意味ですか?
もう一度ありがとう:)
それもうまくいきます!マシン名の値だけを出力することは可能ですか?私が現在出力ファイルで取得している他のすべてのテキストとは対照的に。
したがって、output.txtには現在、これが表示されています...
\ LT013131のレジストリに接続しています...
ローカルにログオンしたユーザー:19/11/2010 09:08:05ドメイン名\ユーザーIDリソース共有を介してログオンしたユーザー:19/11/201011:44:17ドメイン名\ユーザーID
とにかく、リストを実行してLT013131だけを出力するようになっていますか?
したがって、スクリプトが完了すると、マシン名のリストが表示されます。
ありがとう:)