国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

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

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

2020-05-26 14:51李志強(qiáng) ASP.NET教程

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

一.前言

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

二.ProcessStartInfo、Process 類介紹

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

1. ProcessStartInfo 類

ProcessStartInfo主要設(shè)置一些我們需要?jiǎng)?chuàng)建的進(jìn)程的參數(shù)。比如需要啟動(dòng)的應(yīng)用程序的文件名,參數(shù)等等。

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

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

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

fileName:用于啟動(dòng)進(jìn)程的應(yīng)用程序。

arguments:在進(jìn)程啟動(dòng)時(shí)傳遞給應(yīng)用程序的命令行參數(shù)。

(2)主要屬性

CreateNoWindow:指示是否在新窗口中啟動(dòng)進(jìn)程。

RedirectStandardError:指示應(yīng)用程序的錯(cuò)誤輸出是否寫入到流中。

RedirectStandardInput:指示是否從應(yīng)用程序讀取應(yīng)用程序的輸入流。

RedirectStandardOutput:指示應(yīng)用程序的文本輸出是否寫入流。

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

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

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

該類并沒有定義自己的方法,因?yàn)樗饕O(shè)置一些創(chuàng)建進(jìn)程需要的參數(shù)信息。

2. Process 類

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

(1).主要屬性

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

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

StartTime:獲取關(guān)聯(lián)進(jìn)程啟動(dòng)的時(shí)間。

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

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

SessionId:獲取關(guān)聯(lián)進(jìn)程的終端服務(wù)會(huì)話標(biāo)識(shí)符。

StandardError:獲取讀取應(yīng)用程序錯(cuò)誤輸出的流。

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

StandardOutput:獲取用于讀取應(yīng)用程序文本輸出的流。

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

(2).主要方法

Start :啟動(dòng)進(jìn)程

BeginErrorReadLine:異步開始讀取應(yīng)用錯(cuò)誤輸出。

BeginOutputReadLine:異步開始讀取應(yīng)用標(biāo)準(zhǔn)輸出。

CancelErrorRead:取消讀取錯(cuò)誤輸出。

CancelOutputRead:取消讀取標(biāo)準(zhǔn)輸出。

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

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

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

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

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

(3)事件

一共有三個(gè)事件:

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

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

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

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

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

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

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

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)建一個(gè)ProcessStartInfo對(duì)象 使用系統(tǒng)shell 指定命令和參數(shù) 設(shè)置標(biāo)準(zhǔn)輸出
 var psi = new ProcessStartInfo("dotnet", "--info") {RedirectStandardOutput = true};
 //啟動(dòng)
 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跨平臺(tái)執(zhí)行命令、腳本的方法詳細(xì)

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

2.在Linux上執(zhí)行

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

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

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

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

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

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

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

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

3.在OSX上運(yùn)行

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

直接執(zhí)行命令:

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

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

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

可以看出我們?cè)贠SX上執(zhí)行是沒有問題的。

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

編寫腳本的主要邏輯為輸出程序當(dāng)前目錄結(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.編寫測試代碼

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

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

因?yàn)槲覀冃枰鶕?jù)不同的操作類型,選擇不同的腳本來進(jìn)行執(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)建一個(gè)ProcessStartInfo對(duì)象 使用系統(tǒng)shell 指定命令和參數(shù) 設(shè)置標(biāo)準(zhǔn)輸出
 var psi = new ProcessStartInfo(fileName) { RedirectStandardOutput = true };
 //啟動(dòng)
 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下運(yùn)行

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

在windows下運(yùn)行是完全正常的。

4.在OSX運(yùn)行

直接運(yùn)行會(huì)報(bào)一個(gè)權(quán)限異常,如下:

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

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

?
1
chmod +x OSX.sh

然后再次執(zhí)行:

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

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

5.在Linux上運(yùn)行

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

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

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

?
1
chmod +x linux.sh

然后再次執(zhí)行:

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

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

4.容易犯的錯(cuò)誤

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

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

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

?
1
#!/bin/bash

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

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

五.寫在最后

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

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

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

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

 

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 成人午夜性a一级毛片免费看 | ts人妖另类精品视频系列 | 一区二区三区精品 | 视频一区中文字幕 | 日本一区二区高清视频 | 国产午夜精品一区二区三区嫩草 | 午夜视频在线观看网站 | 亚洲精品一区二三区不卡 | 欧美激情国产日韩精品一区18 | 国产免费亚洲 | 亚洲视频1区 | 久久性网站| 日韩国产在线 | 可以免费看黄色的网站 | 亚洲欧美国产日韩综合 | 青青久在线视频 | 中文字幕啪啪 | 欧洲免费av | 欧美老妇交乱视频 | 久久久久亚洲 | 久久午夜精品 | 91精品国产91久久久久久最新 | 色婷婷亚洲一区二区三区 | 成年人毛片在线观看 | 久久精品亚洲一区二区 | 一二三区视频 | 亚洲一区二区免费看 | 最新国产毛片 | 中文字幕高清av | 久久精品中文 | 久久精品国产99 | 午夜在线 | wwwav在线| 欧美日韩在线免费 | 中文字幕亚洲精品 | 久久久久久久久久国产 | 精品无人区一区二区三区动漫 | 337p日本粉嫩噜噜噜 | 日韩三级电影网 | 国产精品久久久久桃色tv | 韩国精品一区二区 |