2012-12-18 28 views
7

Tôi đã tạo một ứng dụng Console để xác thực một hàm và ứng dụng này tôi cần thực thi bằng cách sử dụng vbscript. Sau khi thực hiện lệnh exe này, tôi muốn trả về một mã thoát cho dù hàm có trả về thành công hay không. Làm thế nào tôi có thể trả về một trạng thái hoặc mã thoát trong .net?Làm thế nào để trả lại mã thoát sau khi chạy một exe?

+0

Bạn có thể hiển thị mã của mình không? – gideon

+2

Đặt bảng điều khiển theo cách thủ công.WriteLine trong mã của bạn và đọc giá trị từ Process.StandardOutput hoặc xử lý OutputDataReceived – Amitd

Trả lời

8

Tôi sẽ giả sử bạn đang viết C# hoặc VB.NET. Trong cả hai trường hợp, mọi người thường có chức năng chính không trả về gì cả, nhưng bạn có thể thay đổi điều này để trả về một số nguyên đại diện cho mã thoát.

Để xem C# this MSDN page.

Bạn có thể làm:

static int Main() 
{ 
    //... 
    return 0; 
} 

Đối với VB.NET thấy this MSDN page.

Bạn có thể làm:

Module mainModule 
    Function Main() As Integer 
     '.... 
     '.... 
     Return returnValue 
    End Function 
End Module 
+0

Tôi có thể truy cập giá trị trả về phương thức chính bằng cách sử dụng vbscript không? – JEMI

+0

@JEMI Bạn sẽ có thể. Không thể cho bạn biết chính xác cách thức mà không có mã của bạn. – gideon

+0

đây là mã số static int Main (string [] args) { var ruleManager = new RuleManager(); int status = ruleManager.ExecuteRule(); trạng thái trả lại; } – JEMI

0

Như @gideon nhận xét, trong thực thi của bạn, bạn phải sử dụng return tuyên bố trả lại số.

Trong tập lệnh của bạn, vui lòng đọc %ERRORLEVEL% sau khi gọi tệp thực thi này. Đó là nơi Windows giữ mã trả về.

4

Ngoài @gideon bạn cũng có thể thiết lập

Environment.ExitCode = theExitCode; 

Trong các phần khác của mã và lối ra của bạn trực tiếp nếu có điều gì thực sự tồi tệ đã xảy ra

0

Với này C# chương trình:

class MainReturnValTest { 
    static int Main(string[] args) { 
     int rv = 0; 
     if (1 == args.Length) { 
      try { 
       rv = int.Parse(args[0]); 
      } 
      catch(System.FormatException e)    { 
       System.Console.WriteLine("bingo: '{1}' - {0}", e.Message, args[0]); 
       rv = 1234; 
      } 
     } 
     System.Console.WriteLine("check returns {0}.", rv); 
     return rv; 
    } 
} 

Chạy mẫu:

check.exe 
check returns 0. 

check.exe 15 
check returns 15. 

check.exe nonum 
bingo: 'nonum' Input string was not in a correct format. 
check returns 1234. 

và kịch bản VBScript này (giảm đến mức tối thiểu, không làm điều này trong sản xuất):

Option Explicit 

Const WshFinished = 1 


Dim goWSH : Set goWSH = CreateObject("WScript.Shell") 

Dim sCmd : sCmd = "..\cs\check.exe" 
If 1 = WScript.Arguments.Count Then sCmd = sCmd & " " & WScript.Arguments(0) 
WScript.Echo sCmd 
Dim nRet : nRet = goWSH.Run(sCmd, 0, True) 
WScript.Echo WScript.ScriptName, "would return", nRet 
With goWSH.Exec(sCmd) 
    Do Until .Status = WshFinished : Loop 
    WScript.Echo "stdout of check.exe ==>" & vbCrLf, .Stdout.ReadAll() 
    nRet = .ExitCode 
    WScript.Echo ".ExitCode of check.exe", nRet 
End With 
' !! http://stackoverflow.com/questions/2042558/how-do-i-get-the-errorlevel-variable-set-by-a-command-line-scanner-in-my-c-sha 
WScript.Echo "Errorlevel:", Join(Array(goWSH.Environment("PROCESS")("ERRORLEVEL"), goWSH.ExpandEnvironmentStrings("%ERRORLEVEL%"), "???"), " - ") 
WScript.Echo WScript.ScriptName, "returns", nRet 
WScript.Quit nRet 

mẫu chạy:

cscript 13921064.vbs 
..\cs\check.exe 
13921064.vbs would return 0 
stdout of check.exe ==> 
check returns 0. 

.ExitCode of check.exe 0 
Errorlevel: - %ERRORLEVEL% - ??? <=== surprise, surprise 
13921064.vbs returns 0 

echo %ERRORLEVEL% 
0 

cscript 13921064.vbs nonum & echo %ERRORLEVEL% 
..\cs\check.exe nonum 
13921064.vbs would return 1234 
stdout of check.exe ==> 
bingo: 'nonum' Input string was not in a correct format. 
check returns 1234. 

.ExitCode of check.exe 1234 
Errorlevel: - %ERRORLEVEL% - ??? 
13921064.vbs returns 1234 
0  <=== surprise, surprise 

DNV35 E:\trials\SoTrials\answers\13927081\vbs 
echo %ERRORLEVEL% 
1234 

Bạn sẽ thấy

  • WScript .Quit là cách để trả lại mã thoát từ tập lệnh
  • Bạn bắt đầu quá trình khác bằng cách sử dụng .Run hoặc .Exec
  • .Run trả về mã lối ra của quá trình được gọi là
  • .Exec đặt .ExitCode (sau khi chấm dứt!)
  • Tiếp cận% ERRORLEVEL% trong kịch bản của bạn là vô ích (@LexLi)
  • cscript 13921064.vbs nonum & echo %ERRORLEVEL% là vô dụng quá
Các vấn đề liên quan