激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - .NET Core跨平臺執(zhí)行命令、腳本的方法詳細

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

2020-05-26 14:51李志強 ASP.NET教程

這篇文章主要給大家介紹了關(guān)于.NET Core跨平臺執(zhí)行命令、腳本的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一.前言

在工作中我們可能會遇到需要在程序中執(zhí)行一些系統(tǒng)命令,來獲取一些信息;或者調(diào)用shell腳本。.NET Core 目前已經(jīng)可以跨平臺執(zhí)行,那么它如何跨平臺執(zhí)行命令呢,請看下面的講解。話不多說了,來一起看看詳細的介紹吧

二.ProcessStartInfo、Process 類介紹

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

1. ProcessStartInfo 類

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

(1)構(gòu)造方法

它有三個構(gòu)造方法:

?
1
2
3
public ProcessStartInfo();
public ProcessStartInfo(string fileName);
public ProcessStartInfo(string fileName, string arguments);

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

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

(2)主要屬性

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

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

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

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

StandardErrorEncoding:錯誤輸出內(nèi)容編碼。

StandardOutputEncoding:文本輸出內(nèi)容編碼。

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

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

2. Process 類

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

(1).主要屬性

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

ExitTime:獲取關(guān)聯(lián)進程退出的時間。

StartTime:獲取關(guān)聯(lián)進程啟動的時間。

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

MachineName:獲取運行關(guān)聯(lián)進程的計算機的名稱。

SessionId:獲取關(guān)聯(lián)進程的終端服務會話標識符。

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

StandardInput:獲取應用程序輸入內(nèi)容的流。

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

Threads:獲取關(guān)聯(lián)進程中正在運行的線程集合。

(2).主要方法

Start :啟動進程

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

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

CancelErrorRead:取消讀取錯誤輸出。

CancelOutputRead:取消讀取標準輸出。

Close:釋放與此組件關(guān)聯(lián)的所有資源。

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

Kill:立即停止關(guān)聯(lián)的進程。

Refresh:放棄已經(jīng)在進程中緩存的關(guān)聯(lián)進程的任何信息。

WaitForExit:等待關(guān)聯(lián)進程退出,可以設置超時時間,如不設置則一直等待。

(3)事件

一共有三個事件:

ErrorDataReceived:接收到關(guān)聯(lián)進程輸出錯誤數(shù)據(jù)。

OutputDataReceived:接收到關(guān)聯(lián)進程輸出標準數(shù)據(jù)。

Exited:關(guān)聯(lián)進程退出

三.在Windows OSX Linux 下執(zhí)行命令

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

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

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

1.編寫代碼執(zhí)行命令

編寫的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
static void Main()
{
 //創(chuàng)建一個ProcessStartInfo對象 使用系統(tǒng)shell 指定命令和參數(shù) 設置標準輸出
 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}");
 }
}

執(zhí)行結(jié)果如下:

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

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

2.在Linux上執(zhí)行

使用的系統(tǒng)環(huán)境為CentOS 7.2,.NET Core sdk版本為2.0.3。

直接執(zhí)行命令結(jié)果如下:

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

我將代碼上傳到git server,然后在linux上clone然后執(zhí)行結(jié)果如下:

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

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

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

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

3.在OSX上運行

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

直接執(zhí)行命令:

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

從git Clone代碼,執(zhí)行結(jié)果如下:

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

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

四.在Windows OSX Linux 下執(zhí)行腳本1.編寫測試腳本

編寫腳本的主要邏輯為輸出程序當前目錄結(jié)構(gòu),然后輸出一句話 “dotnet in 操作系統(tǒng)類型”

Windows: win.bat

?
1
2
3
@echo off
dir
echo "dotnet in Windows"

Linux: linux.sh

?
1
2
3
#!/bin/bash
ls
echo "dotnet in Linux"

OSX: OSX.sh

?
1
2
3
#!/bin/bash
ls
echo "dotnet in OSX"

2.編寫測試代碼

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

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

因為我們需要根據(jù)不同的操作類型,選擇不同的腳本來進行執(zhí)行,所以我們需要在代碼里面判斷一下操作系統(tǒng)類型。我們可以通過 RuntimeInformation.IsOSPlatform來判斷。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
static void Main()
{
 string fileName="shell/";
 
 //根據(jù)系統(tǒng)使用不同的shell文件
 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
 {
  fileName += "win.bat";
 }
 else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
 {
  fileName += "linux.sh";
 }
 else
 {
  fileName += "OSX.sh";
 }
 //創(chuàng)建一個ProcessStartInfo對象 使用系統(tǒng)shell 指定命令和參數(shù) 設置標準輸出
 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跨平臺執(zhí)行命令、腳本的方法詳細

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

4.在OSX運行

直接運行會報一個權(quán)限異常,如下:

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

使用命令加入執(zhí)行權(quán)限:

?
1
chmod +x OSX.sh

然后再次執(zhí)行:

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

可以看到成功執(zhí)行了腳本。

5.在Linux上運行

直接運行也是會有權(quán)限問題的:

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

同樣使用命令加入執(zhí)行權(quán)限:

?
1
chmod +x linux.sh

然后再次執(zhí)行:

.NET Core跨平臺執(zhí)行命令、腳本的方法詳細

可以看到成功執(zhí)行了我們的腳本。

4.容易犯的錯誤

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

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

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

?
1
#!/bin/bash

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

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

五.寫在最后

希望本文能給大家?guī)韼椭缬袉栴}歡迎和我討論。

本文所用代碼地址:https://github.com/stulzq/BlogDemos/tree/master/DotnetCmd

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.cnblogs.com/stulzq/p/9074965.html

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.7777在线 | 精品在线免费播放 | 久久久久久久久久91 | 91精品久久香蕉国产线看观看 | 草莓福利视频在线观看 | 免费观看视频在线 | 欧美中文字幕一区二区 | 日韩精品中文字幕一区 | 国产亚洲精品影达达兔 | 久久av免费 | 日韩av影片在线观看 | 蜜桃一本色道久久综合亚洲精品冫 | 成人爱爱电影 | 久久精品视频黄色 | 久久久久久久久久综合 | 国产精品视频专区 | 在线免费av观看 | 国产免费看片 | 国产精品久久久久久久久久久久午夜 | 国产69精品久久久久孕妇黑 | 欧美成人一区二区三区电影 | 成人毛片100部免费观看 | 日韩在线欧美在线 | 午夜精品久久久久久中宇 | 精品午夜久久 | 9191久久久久视频 | 色猫av | 亚欧在线免费观看 | 国产精品99久久久久久宅女 | 国产老师做www爽爽爽视频 | 爱性久久久久久久 | 色域tv | 九九热精彩视频 | 国产精品成人一区二区三区电影毛片 | 欧美日韩在线视频一区 | 中文区永久区 | 久章草在线视频 | 亚洲欧美日韩久久精品第一区 | 91不卡在线 | 双性帝王调教跪撅打屁股 | 欧美城天堂网 |