2017-03-09 14 views
1

シェルコマンドを実行してデータの出力を確認する際に問題が発生しています。 DBの現在のリモートユーザがアクティブである場合、vbaを使用してチェックしたいと思います。vbaシェルコマンドが実行されていますが、出力がありません

コマンドプロンプトで=

for /f "tokens=1-8" %a in ('quser') do @if "%d"== "Active" echo %COMPUTERNAME% %a %d 

は、ユーザーが、私はそれらのどれもが(「ディスク」)が切断されていないことを確認したいログオンし、それらの状態を返します。私はシェルをチェックし、

Public Function ShellRun(sCmd As String) As String 
'Run a shell command, returning the output as a string' 

Dim oShell As Object 
Set oShell = CreateObject("WScript.Shell") 

'run command' 
Dim oExec As Object 
Dim oOutput As Object 
Set oExec = oShell.Exec(sCmd) 
Set oOutput = oExec.StdOut 
Debug.Print sCmd 

'handle the results as they are written to and read from the StdOut object' 
Dim s As String 
Dim sLine As String 

While Not oOutput.AtEndOfStream 
sLine = oOutput.ReadLine 
If sLine <> "" Then s = s & sLine & vbCrLf 
Wend 

ShellRun = s 
'example MsgBox ShellRun("cmd.exe /c" & "dir c:\") 
End Function 

CALLコマンド

Dim CMDLineCommand As String 
CMDLineCommand = "for /f ""tokens=1-8"" %a in ('quser') do @if ""%d""== ""Active"" echo %COMPUTERNAME% %a %d" 
'(CMDLineCommand = "dir c:\")<------ THIS WORKS FINE 
MsgBox ShellRun("cmd.exe /c " & CMDLineCommand) 

これは、コマンドラインの負荷Iコマンドのため正常に動作クリックイベントに使用されるメッセージボックスに文字列としてパイプ値を戻すには、この機能を使用しましたそれをテストしていますが、クエリを実行していないため、ユーザに問い合わせていません。 query userコマンドはコマンドラインから正常に動作しますが、VBAシェルコマンドで発行された場合は何も返しません。

どのような考えにも感謝します。

+0

私はフォーラムの書式設定で間違いを犯したに違いありません。ありがとうございます。 – Animal811

+0

私はWhileを挿入した後にVBA構文エラーが発生しなかった理由を頭に傷つけてしまいました。そして、「前の行」がコメントであることに気付きましただから、それはすべての余分な声明を無視したばかりだった - ええ、私はひざまずいていない。 – YowE3K

+0

@ YowE3K私はそれがうまくいかない理由と解決策を見つけ出すことができました。シェルはquery.exe(quesr)のパスを知らないので、コマンドプロンプトでシステム変数を使用してexeファイルを見つけることができます。解決策は、query.exeを見つけ、それを作業ディレクトリにコピーし、シェルコマンドを実行します。私はC:\ Windows \ WinSxS内のハッシュされたフォルダにありました。ここでは64ビット版と32ビットですので注意してください。 – Animal811

答えて

0

シェルはquery.exe(quesr)のパスを知らないので、コマンドプロンプトでシステム変数を使用してexeファイルを見つけることができます。解決策は、query.exeを見つけ、それを作業ディレクトリにコピーし、シェルコマンドを実行します。私はC:\ Windows \ WinSxS内のハッシュされたフォルダにありました。ここでは64ビット版と32ビットですので注意してください。

関連する問題