2010-01-11 16 views
11

在我的網站上,我希望在將任何上傳的文件保存到我的數據庫之前對其進行病毒檢查。因此,我將文件保存到本地目錄,然後從C#程序中啓動命令行掃描程序。下面是我使用的代碼:如何在C#程序中獲得由命令行掃描程序設置的「ERRORLEVEL」變量?

我的問題是Environment.GetEnvironmentVariable( 「ERRORLEVEL」)總是返回null。它應該返回一個數字。那麼如何在C#程序中獲得由命令行掃描程序設置的「ERRORLEVEL」?

回答

16

據我所知,這只是您的過程的ExitCode。使用它。

只有在等待過程結束後檢查纔有用,順便說一句。

6

您似乎已經翻譯了一個批處理腳本,它檢查ERRORLEVEL特殊變量以替代或更熟悉的unix腳本退出代碼。

ERRORLEVEL是一個特殊的變量,它對應於一個進程的ExitCode

你的代碼是試圖要做的是從它自己的進程中讀取一個環境變量,因爲它是由子進程設置的。

在這種情況下,批處理腳本似乎正在執行此操作,它們實際上依賴於操作系統的腳本環境在退出過程中爲您更改此特殊變量。 當在一個更加完善的特色編程環境中嘗試複製類似的功能時,這是有問題的(爲什麼從c#這將是一個壞主意,考慮如果兩個線程同時啓動兩個進程會發生什麼)。

相反,你必須與子進程交互像樣的API,慣用相當於如下:

using (Process process = new Process()) 
{ 
    process.StartInfo = startInfo; 
    process.Start(); 
    // only if you need the output for debugging 
    //string output = process.StandardOutput.ReadToEnd(); 
    process.WaitForExit(); 
    return process.ExitCode; 
} 

這裏需要注意的(如與其他答案),您必須先等待進程退出然後才能查看退出代碼。

+0

爲什麼這會降低投票率?這和我的答案是一樣的 - 儘管我認爲第一部分是對這個問題的誤解? – 2010-01-11 15:11:54

+0

我正在解釋*爲什麼*他嘗試讀取ERRORLEVEL(即使它是'正常'環境變量)註定要失敗(以及不等待退出)。 顯然有人認爲我沒有意識到這一點或認爲我沒有足夠清楚地解釋。我會修改,以使其更清晰 – ShuggyCoUk 2010-01-11 15:48:58

+0

你是絕對正確的,我正在看批處理腳本。非常感謝,我已經提出了答案,因爲這對我非常有幫助。 – Colin 2010-01-11 16:04:16