2017-03-09 126 views
1

我在運行shell命令並檢查數據輸出時遇到了一些問題。如果數據庫的當前遠程用戶處於活動狀態,我希望使用vba進行檢查。在vba shell命令執行但沒有輸出

命令提示符=

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 

呼叫使用的命令

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) 

這工作正常進行命令行的負荷命令我已經測試過但沒有查詢,因此查詢用戶。查詢用戶命令可以在命令行中正常工作,但在通過VBA Shell命令發出時不會返回任何內容。

任何想法將不勝感激。

+0

沒關係while語句在那裏,它只是在上一行的結尾,我一定在論壇的格式上犯了一個錯誤。感謝您的評論 – Animal811

+0

你讓我撓腦袋第二個想知道爲什麼它不會導致我有一個VBA語法錯誤,當我嘗試運行後,我插入一段時間後,然後意識到「前一行」是評論所以它只是忽略了所有額外的陳述 - 呃,我沒有打擊。 – YowE3K

+0

@ YowE3K我設法弄清楚它爲什麼不起作用和解決方案。因爲shell不知道query.exe(quesr)的路徑,所以它不會繼續,因爲命令提示符可以使用系統變量來查找exe。解決方案找到query.exe並將其複製到工作目錄,然後運行shell命令。我位於C:\ Windows \ WinSxS內的哈希文件夾中,因爲這裏是64位版本和32位,請注意。 – Animal811

回答

0

因爲shell不知道query.exe的路徑(quesr),它不會繼續,因爲命令提示符可以使用系統變量來查找exe的。解決方案找到query.exe並將其複製到工作目錄,然後運行shell命令。我位於C:\ Windows \ WinSxS內的哈希文件夾中,因爲這裏是64位版本和32位,請注意。