探索Windows命令行系列(7):通過命令編譯C#類和Java類


1、編譯 C# 類

1.1、C# 編譯工具

csc.exe 是 Microsoft .NET Framework 中的 C# 編譯器,它支持很多編譯選項。在 cmd 中鍵入csc /help,然后回車即可看到所有的 Visual C# 編譯器選項和說明。

csc.exe 中有 6 個帶默認值的選項。其中/out:<文件>選項用於指定輸出文件名,可指定多個文件名甚至可以用通配符,默認取包含主類(含 Main 方法的類)的文件或第一個文件的基名稱(不含后綴);而/target:exe選項表示生成控制台可執行文件,即默認生成以 exe 為后綴的可執行文件,該選項可縮寫為/t:exe

我通過百度大致的檢索了一下,發現大量關於 csc 的報錯問題居然是“csc 不是內部或外部命令……”。如果你看了本系列前面幾篇博文,相信你一眼就能看出這顯然不是一個有關 .NET 的問題,而是 Windows 的基礎問題。所有在這兒我還是簡單提一下,如果你恰好遇到這個問題,有如下兩個辦法:

  • 第一個,把你本機的 .NET 主目錄加入到 path 環境變量中去,然后就可以通過 cmd 調用 csc 了。
  • 第二個,找到你本機安裝的 Visual Studio 中提供的開發人員命令提示符工具(每個版本的 VS 都有提供,盡管路徑不一樣,但在開始菜單的 Visual Studio Tools 里面一般都能找到),它主要也就是提前幫你設置好了工具的執行路徑。

1.2、編譯一個 C# 類

第一步,將如下 C# 代碼保存為D:\Workspace\SayHello.cs文件。

public class SayHello
{
    public static void Main(string[] args)
    {
        System.Console.WriteLine("你好,C#");
        System.Console.ReadKey();
    }
}

第二步,在命令行中鍵入csc sayhello.cs后回車即可完成編譯。如下圖所示:
cmd06

編譯完成之后,你會發現 D:\Workspace 目錄下多了一個 SayHello.exe 文件,雙擊它的效果如下:
cmd07

至於編譯生成的文件名為什么是 SayHello.exe,上一小節已經講過了。這里要說的是,假如你想讓它生成一個你指定名稱的可執行文件,比如指定為 chinese.exe 的話,那么你需要鍵入csc /out:chinese.exe sayhello.cs命令並回車即可。

1.3、編譯多個 C# 類

第一步,將如下 C# 代碼保存為D:\Workspace\SayHello.cs文件。

public class SayHello
{
    public static void Main(string[] args)
    {
        System.Console.WriteLine("你好,C#");
        Test.Try(); // 調用 Test 類中的 Try 方法
        System.Console.ReadKey();
    }
}

將如下 C# 代碼保存為D:\Workspace\Test.cs文件。

public class Test
{
    public static void Try()
    {
        System.Console.WriteLine("Just a try!");
    }
}

第二步,在命令行中鍵入csc sayhello.cs test.cs后並回車,再次雙擊 SayHello.exe 文件,效果如下:
cmd08

再補充幾個命令:

  • csc /out:say.exe sayhello.cs test.cs表示將 sayhello.cs 和 test.cs 兩個類文件編譯成 say.exe 文件。
  • csc /out:sayall.exe *.cs表示將當前目錄下的所有 C# 類文件編譯成 sayall.exe 文件。
  • csc /utf8output *.cs表示將當前目錄下的所有 C# 類文件按 UTF-8 編碼來編譯輸出。
  • csc /target:library test.cs表示將 test.cs 類文件編譯成 Test.dll 文件。
  • csc /target:library /out:say.dll *.cs表示將當前目錄下的所有 C# 類文件編譯成 say.dll 文件。

2、編譯 Java 類

2.1、Java 編譯工具

Java 的開發工具包是 JDK,在 JDK 中有用於編譯 Java 的工具 javac.exe,還有用於運行 Java 的工具 java.exe 等。javac 和 java 都有很多選項,且它們都有一個默認的參數-help,這意味着如果你想了解它們全部的選項和說明,直接在 cmd 中鍵入工具名 javac 或 java 並回車即可。

事實上編譯 Java 類比編譯 C# 類要相對復雜一些。首先,javac.exe 會把 Java 代碼編譯成 class 文件,而不是可執行程序,這就意味着你還需要額外的工具(java.exe)來運行 Java 程序。其次,JDK 對編碼格式的處理不太好,常需要手工指定。再次,在調用 class 文件的時候,你必須確保大小寫完全一致,而且不能帶 class 后綴,否則就會報錯。

所以對初學者而言,通過命令行編譯 Java 代碼可能會遇到更多各種各樣的問題。同樣令人遺憾的是,網上關於“javac 不是內部或外部命令……”的問題也非常多,如果你遇到這個問題請仔細檢查你本機的 JDK 是否安裝成功,以及環境變量是否配置正確。

2.2、編譯 Java 類

第一步,將如下 Java 代碼保存為D:\Workspace\SayHello.java文件。

public class SayHello{
    public static void main(String[] args){
        System.out.println("你好,Java");
    }
}

第二步,在命令行中鍵入javac -encoding utf8 sayhello.java后回車即可完成編譯。如下圖所示:
cmd09

上述命令中的-encoding參數理論上不是必須的,但實際上幾乎就是必須的。因為 javac.exe 會根據當前操作系統的默認編碼格式來轉化程序代碼(忽略文件編碼格式)。眾所周知 Windows 中默認編碼是 ANSI,對應到中國就是 GBK,而大多數文本編輯器默認都是 UTF-8,所以如果你不指定-encoding參數的話編譯時就會報“編碼GBK的不可映射字符”的錯誤。

第三步,在命令行中鍵入java SayHello后回車,效果如下所示:
cmd10

上述命令中一定要注意大小寫一致的問題,而且不能帶 class 后綴,否則就會報錯。另外,編譯多個 Java 類與編譯多個 C# 類的思路完全一樣,這里就不再贅述了。

3、組合命令符

在本系列前面幾篇文章中已陸續出現了大部分命令行特殊字符。如:命令行回顯屏蔽符 @、批處理變量引導符 %、轉義字符 ^、通配符 *、字符串界定符 "(雙引號)、命令界定符 '(單引號)、重定向符 > 和 >>、命令管道符 | 等。本節再來說說命令行中的三個組合命令符 &、&& 以及 ||。

如下腳本(當命令正確運行到此處時,將逐行依次輸出 a、b、c):

if errorlevel==0 (
    echo a
    echo b
    echo c
)

上述腳本還可以改寫成:

if errorlevel==0 (echo a & echo b & echo c)

或:

if errorlevel==0 (echo a && echo b && echo c)

&的語法是:第一條命令 & 第二條命令 [& 第三條命令...],表達式中的所有命令都將被執行,即便前面的命令執行失敗了,后面的命令也依舊會被執行。

&&的語法是:第一條命令 && 第二條命令 [&& 第三條命令...],表達式中的命令將依次被執行,如果遇到錯誤將不再執行后面的命令,只有執行一直不出錯的情況下才會執行完所有命令。

如果把前面那個腳本改寫成(則只會輸出 a):

if errorlevel==0 (echo a || echo b || echo c)

||的語法是:第一條命令 || 第二條命令 [|| 第三條命令...],與 && 恰恰相反的是,僅當 || 前面的命令執行執行失敗時才會執行后面的命令。如果第一條命令執行成功就只會執行第一條命令,當第一條命令執行失敗后才會執行第二條命令,只有當前面的所有命令都執行失敗時,才會執行到最后一條命令。

額外補充:本系列前幾篇博文中多次出現echo.,它的作用是返回一個空行。需要注意的是 echo 和后面的點得緊挨着,中間不能有空格,否則就會直接輸出點了。其實 echo 后面的點還可以用逗號(,)、分號(😉、冒號(😃、加號(+)、正斜線(/)、反斜線()、前中括號([)、后中括號(])里的任意一個字符來代替。

4、總結

4.1、學校里學的有沒有用?

通過命令行手工編譯類的知識往往只有科班才會講解,有些培訓結構和入門書籍中提都沒提。我當初因為打字太慢沒跟上節奏,看到四周的同學全都編譯通過了,而我連類的代碼都還沒敲完。晚上回到宿舍后本想上網查資料繼續完成白天沒完成的內容,結果卻看到很多人說沒必要學這個,公司里都用 IDE,學校里學的沒用……最后,我放棄了,同時我內心也產生了一些疑問,學校里學的這些真的沒用嗎?如果是這樣,那老師為什么還要講呢?

直到工作后的某一天,我遇到一個似乎超出能力范圍的問題,現如今我已記不清楚是什么問題了。但我清楚的記得,網上某位大神給出的解決方案就是調出 cmd 然后鍵入幾個命令回車即可,我照做之后果然搞定了。於是乎,我也慢慢開始嘗試用 cmd 解決一些用圖形化工具不好解決的問題。

后來我才逐漸理解,學習命令行手工編譯相關知識,有助於讓學生了解編譯和執行的過程,加深學生的記憶和理解程度,鍛煉學生的動手能力,培養學生的程序化思維。一個負責任的老師絕不希望自己的學生是那種只會用 IDE 等自動化工具,卻沒有思考和動手能力的人!

再后來我甚至開始勸告身邊的某些人,別總把“學校里學的沒用”掛嘴邊!學校里你的老師主要是幫你搞好學習,因為學校主要看你學的怎么樣;而公司里你的上司主要是幫你完成工作,因為公司主要看你干的怎么樣。考核指標都變了,你又怎么能指望學校里學的東西能完全用到公司呢?即便你上家公司學到的東西也不能完全用到下家公司吧!

對於“學校里學的有沒有用”這個問題,我后來一貫的主張是:如果你覺得學校里學的沒用,那肯定是因為你沒用!要么你選錯了學習方向,學了卻用不上;要么你根本沒學會,學過卻不知道有什么用!

4.2、本文總結

本文主要講解了如何通過命令行工具來手工編譯 C# 類和 Java 類。盡管有很多程序最終跑在 Linux 上,但絕大部分程序員依然是用 Windows 做開發。所以做為一名程序員,如果能學着用命令行工具,並在必要的時候合理運用,定能更快更好的完成開發任務。

事實上有些任務我們也只能用命令行工具來完成,因為 IDE 可能並沒有提供相關功能或相關功能太不好用。譬如在 .NET 平台上,向 IIS 重新注冊 Asp.Net 得用aspnet_regiis -i命令,注冊系統服務得用installutil myService.exe命令,卸載系統服務得用installutil myService.exe -u命令等。事實上,無論是 .NET 平台還是 Java 平台,官方都提供了很多命令行工具。

C#/.NET 平台的命令行工具官方參考鏈接:

Java 平台的命令行工具相關參考鏈接:

4.3、本系列總結

本系列博文主要介紹了 Windows 命令行的基本使用方法和常見命令腳本,而且 cmd.exe 支持的命令 powershell.exe 一般也都能支持。本系列內容主要是結合 cmd.exe 來展開的,畢竟調用 cmd 更方便,我本人也更熟悉 cmd 一些。

下面是我在寫本系列時搜集到的一些有關 Windows 命令行的參考站點或帖子(盡管本次寫作過程中沒用上,但以后再用到命令行的時候也許就能派上用場了,哈哈!):

本文鏈接http://www.cnblogs.com/hanzongze/p/cmd-compiles.html
版權聲明:本文為博客園博主 韓宗澤 原創,作者保留署名權!歡迎通過轉載、演繹或其它傳播方式來使用本文,但必須在明顯位置給出作者署名和本文鏈接!個人博客,能力有限,若有不當之處,敬請批評指正,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM