<em id="3iliw"></em>
  • <progress id="3iliw"></progress>
  • <tbody id="3iliw"><pre id="3iliw"></pre></tbody><dd id="3iliw"><noscript id="3iliw"></noscript></dd>

    <progress id="3iliw"></progress>

    杭州.net培訓
    達內杭州.net培訓中心

    13175137725

    .NET Core如何跨平臺執行命令、腳本?

    • 時間:2018-11-05 14:05
    • 發布:轉載
    • 來源:網絡

    .NET Core目前已經可以跨平臺執行,那么它如何跨平臺執行命令呢,大家一起看看下面的講解。

    二、ProcessStartInfo、Process 類介紹

    我們主要用到的兩個類就是 ProcessStartInfo 和 Process ,他們的用法和.NET Framework下是一樣的。

    1、ProcessStartInfo 類

    ProcessStartInfo主要設置一些我們需要創建的進程的參數。比如需要啟動的應用程序的文件名,參數等等。

    (1)構造方法

    它有三個構造方法:

    public ProcessStartInfo();

    public ProcessStartInfo(string fileName);

    public ProcessStartInfo(string fileName, string arguments);

    ●fileName:用于啟動進程的應用程序。

    arguments:在進程啟動時傳遞給應用程序的命令行參數。

    (2)主要屬性

    CreateNoWindow:指示是否在新窗口中啟動進程。

    RedirectStandardError:指示應用程序的錯誤輸出是否寫入到流中。

    RedirectStandardInput:指示是否從應用程序讀取應用程序的輸入流。

    RedirectStandardOutput:指示應用程序的文本輸出是否寫入流。

    StandardErrorEncoding:錯誤輸出內容編碼。

    StandardOutputEncoding:文本輸出內容編碼。

    UseShellExecute:指示是否使用操作系統shell啟動進程。如果啟動進程時使用shell,則為true; 如果應該直接從可執行文件創建進程,則為false。 默認值是true。

    該類并沒有定義自己的方法,因為它主要設置一些創建進程需要的參數信息。

    2、Process 類

    該類的主要作用是提供對本地和遠程進程的訪問,并使你能夠啟動和停止本地系統進程。

    (1).主要屬性

    ExitCode:獲取退出代碼。0表示正常, 非0表示非正常退出。

    ExitTime:獲取關聯進程退出的時間。

    StartTime:獲取關聯進程啟動的時間。

    HasExited:獲取一個值,指示相關進程是否已終止。

    MachineName:獲取運行關聯進程的計算機的名稱。

    SessionId:獲取關聯進程的終端服務會話標識符。

    StandardError:獲取讀取應用程序錯誤輸出的流。

    StandardInput:獲取應用程序輸入內容的流。

    StandardOutput:獲取用于讀取應用程序文本輸出的流。

    Threads:獲取關聯進程中正在運行的線程集合。

    (2).主要方法

    Start :啟動進程

    BeginErrorReadLine:異步開始讀取應用錯誤輸出。

    BeginOutputReadLine:異步開始讀取應用標準輸出。

    CancelErrorRead:取消讀取錯誤輸出。

    CancelOutputRead:取消讀取標準輸出。

    Close:釋放與此組件關聯的所有資源。

    CloseMainWindow:通過向其主窗口發送關閉消息來關閉具有用戶界面的進程。

    Kill:立即停止關聯的進程。

    Refresh:放棄已經在進程中緩存的關聯進程的任何信息。

    WaitForExit:等待關聯進程退出,可以設置超時時間,如不設置則一直等待。

    (3)事件

    一共有三個事件:

    ErrorDataReceived:接收到關聯進程輸出錯誤數據。

    OutputDataReceived:接收到關聯進程輸出標準數據。

    Exited:關聯進程退出

    三、在Windows OSX Linux 下執行命令

    這里我選擇.NET Core帶的 dotnet --info輸出.NET Core SDK&Runtime相關的信息。

    我們通過cmd執行會收到下面的信息:

    .NET Core 跨平臺執行命令、腳本

    1、編寫代碼執行命令

    編寫的代碼如下:

    static void Main()

    {

    //創建一個ProcessStartInfo對象 使用系統shell 指定命令和參數 設置標準輸出

    var psi = new ProcessStartInfo("dotnet", "--info") {RedirectStandardOutput = true};

    //啟動

    var proc=Process.Start(psi);

    if (proc == null)

    {

    Console.WriteLine("Can not exec.");

    }

    else

    {

    Console.WriteLine("-------------Start read standard output--------------");

    //開始讀取

    using (var sr = proc.StandardOutput)

    {

    while (!sr.EndOfStream)

    {

    Console.WriteLine(sr.ReadLine());

    }

    if (!proc.HasExited)

    {

    proc.Kill();

    }

    }

    Console.WriteLine("---------------Read end------------------");

    Console.WriteLine($"Total execute time :{(proc.ExitTime-proc.StartTime).TotalMilliseconds} ms");

    Console.WriteLine($"Exited Code : {proc.ExitCode}");

    }

    }

    執行結果如下:

    .NET Core 跨平臺執行命令、腳本

    從執行結果可以看出,我們通過編寫的程序來執行dotnet --info命令獲取的結果幾乎一樣,只有第一行的提示,我們通過cmd執行命令輸出的是中文,我們通過程序調用執行輸出的是英文,這個問題,有興趣的朋友可以研究一下。

    2、在Linux上執行

    使用的系統環境為CentOS 7.2,.NET Core sdk版本為2.0.3。

    直接執行命令結果如下:

    .NET Core 跨平臺執行命令、腳本

    我將代碼上傳到git server,然后在linux上clone然后執行結果如下:

    .NET Core 跨平臺執行命令、腳本

    可以看到我們獲取執行輸出是沒有問題的,但是獲取進程開始執行出錯了,無法從進程檢索該信息,現在我們移除統計執行時間的代碼:

    .NET Core 跨平臺執行命令、腳本

    這下我們執行就沒有問題了。從這里我們可以得出結論:由于平臺的差異,獲取一些信息可能會出現異常,所以我們實際一定要在多個平臺上測試。

    3、在OSX上運行

    我在OSX上的.NET Core SDK版本為2.0.0 很久沒更新了。

    直接執行命令:

    .NET Core 跨平臺執行命令、腳本

    從git Clone代碼,執行結果如下:

    .NET Core 跨平臺執行命令、腳本

    可以看出我們在OSX上執行是沒有問題的。

    四、在Windows OSX Linux 下執行腳本

    1、編寫測試腳本

    編寫腳本的主要邏輯為輸出程序當前目錄結構,然后輸出一句話 “dotnet in 操作系統類型”

    Windows: win.bat

    @echo off

    dir

    echo "dotnet in Windows"

    Linux: linux.sh

    #!/bin/bash

    ls

    echo "dotnet in Linux"

    OSX: OSX.sh

    #!/bin/bash

    ls

    echo "dotnet in OSX"

    2、編寫測試代碼

    我將所有的腳本都放在 項目根目錄/shell 文件夾下。

    .NET Core 跨平臺執行命令、腳本

    因為我們需要根據不同的操作類型,選擇不同的腳本來進行執行,所以我們需要在代碼里面判斷一下操作系統類型。

    我們可以通過 RuntimeInformation.IsOSPlatform來判斷。

    static void Main()

    {

    string fileName="shell/";

    //根據系統使用不同的shell文件

    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))

    {

    fileName += "win.bat";

    }

    else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))

    {

    fileName += "linux.sh";

    }

    else

    {

    fileName += "OSX.sh";

    }

    //創建一個ProcessStartInfo對象 使用系統shell 指定命令和參數 設置標準輸出

    var psi = new ProcessStartInfo(fileName) { RedirectStandardOutput = true };

    //啟動

    var proc = Process.Start(psi);

    if (proc == null)

    {

    Console.WriteLine("Can not exec.");

    }

    else

    {

    Console.WriteLine("-------------Start read standard output--------------");

    //開始讀取

    using (var sr = proc.StandardOutput)

    {

    while (!sr.EndOfStream)

    {

    Console.WriteLine(sr.ReadLine());

    }

    if (!proc.HasExited)

    {

    proc.Kill();

    }

    }

    Console.WriteLine("---------------Read end------------------");

    Console.WriteLine($"Exited Code : {proc.ExitCode}");

    }

    }

    3、在Windows下運行

    .NET Core 跨平臺執行命令、腳本

    在windows下運行是完全正常的。

    4、在OSX運行

    直接運行會報一個權限異常,如下:

    .NET Core 跨平臺執行命令、腳本

    使用命令加入執行權限:

    chmod +x OSX.sh

    然后再次執行:

    .NET Core 跨平臺執行命令、腳本

    可以看到成功執行了腳本。

    5、在Linux上運行

    直接運行也是會有權限問題的:

    .NET Core 跨平臺執行命令、腳本

    同樣使用命令加入執行權限:

    chmod +x linux.sh

    然后再次執行:

    .NET Core 跨平臺執行命令、腳本

    可以看到成功執行了我們的腳本。

    6、容易犯的錯誤

    看見上面的例子,我都成功執行了,其實我踩了幾個坑,花了我不少時間來解決。

    1.sh腳本一定要指定命令解析器

    也就是這句話,放在sh腳本開頭

    #!/bin/bash

    2.不管是windows linux osx 腳本編碼必須為 ANSI

    不然程序執行的時候,讀取字符會出錯,造成執行異常。

    五、寫在最后

    希望本文能給大家帶來幫助,如有問題歡迎咨詢達內在線老師。

    預約申請免費試聽課

    怕錢不夠?就業掙錢后再付學費!    怕學不會?從入學起,達內定制課程!     擔心就業?達內多家實踐企業供你挑選!

    上一篇:淺拷貝和深拷貝
    下一篇:沒有下一篇了
    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    江西省

    貴州省

    廣西省

    海南省

    国拍自产亚洲 2019国拍自产在线,国拍自产亚洲,国产a在线不卡 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>