操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    概述

    在我的上一篇文章中,我們學(xué)會了通過 Scoop 和 WSL 快速搭建各種開發(fā)環(huán)境,但是有沒有發(fā)現(xiàn)默認(rèn)的 powershell 很丑而且不好用,今天教大家怎樣安裝 Windows Terminal以及美化,Windows TerminalWSL2 的理想配套,它速度快、可配置、外觀漂亮,并且提供了 Windows 和 Linux 開發(fā)的所有優(yōu)點(diǎn)。

    不多說,先看下美化后的 Windows Terminal。

    2 安裝

    以管理員權(quán)限打開 powershell 并運(yùn)行下面命令:

    # 安裝 Windows Terminal 最新版本
    scoop install -g extras/windows-terminal
    # 安裝 powershell 最新版本, windows 默認(rèn)的 powershell 版本很低
    scoop install -g main/pwsh
    # 安裝字體
    scoop install -g nerd-fonts/Cascadia-Code
    # 安裝openssh
    scoop install -g main/openssh

    3 windows-terminal 配置

    3.1 配置右鍵菜單

    新建 windows-terminal.reg 文件,文件內(nèi)容如下:

    Windows Registry Editor Version 5.00
     
    [HKEY_CLASSES_ROOT\Directory\Background\shell\WindowsTerminal]
    @="Windows Terminal Here"
    "Icon"="D:\\Softwares\\Scoop\\GlobalApps\\apps\\windows-terminal\\current\\WindowsTerminal.exe"
     
    [HKEY_CLASSES_ROOT\Directory\Background\shell\WindowsTerminal\command]
    @="D:\\Softwares\\Scoop\\GlobalApps\\apps\\windows-terminal\\current\\WindowsTerminal.exe"

    其中的路徑是安裝 windows-terminal的路徑,配置完成后雙擊運(yùn)行。

    3.2 配置 pwsh

    1.右鍵打開 windows-terminal, 選擇設(shè)置。

    2.選擇添加新的配置文件。

    3.選擇復(fù)制配置文件。

    4.修改配置文件為 pwsh 的配置文件。

    5.修改啟動為 pwsh

    6.選擇配色方案。

    3.3 全局配置

    打開配置文件,進(jìn)行全局配置,全局配置是在 defaults下配置的,list 下是單獨(dú)配置每個(gè)命令行的,list 下的配置會覆蓋全局配置的,如果在 defaults下已經(jīng)配置了,list 下相同的配置需要刪除,全局配置內(nèi)容如下:

    "defaults": {
        // 配置背景圖片
        "backgroundImage": "D:\\SoftwareConfigs\\Windows-terminal\\background.jpg",
        // 配置透明度
        "backgroundImageOpacity": 0.1,
        // 配置主題
        "colorScheme": "One Half Dark",
        // 配置字體
        "font": {
            "face": "Cascadia Mono",
            "size": 12
        },
        // 配置歷史記錄大小
        "historySize": 9001,
        // 配置啟動時(shí)進(jìn)入的目錄,配置為 null時(shí)會進(jìn)入右鍵打開時(shí)所在的目錄
        "startingDirectory": null,
        // 選擇文本底色
        "selectionBackground": "#EE3A8C"
    },

    4 pwsh 配置

    4.1 安裝插件

    為了讓 pwsh 更好用,我們需要安裝一些 powershell的插件,運(yùn)行下面命令進(jìn)行安裝:

    Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
    Set-ExecutionPolicy remotesigned
    # PowerShell 的彩色文件列表
    Install-Module -AllowClobber Get-ChildItemColor -Scope AllUsers
    # 增強(qiáng) git 功能
    PowerShellGet\Install-Module -Name posh-git -Scope AllUsers -AllowPrerelease -Force
    PowerShellGet\Install-Module posh-sshell -Scope AllUsers
    # 美化 powershell
    Install-Module -Name oh-my-posh -Scope AllUsers
    # git 別名支持
    Install-Module -Name git-aliases -Scope AllUsers
    # powershell 增強(qiáng)
    Install-Module -Name PSReadLine -AllowPrerelease -Scope AllUsers -Force -SkipPublisherCheck
    # 系統(tǒng)信息輸出
    Install-Module windows-screenfetch -Scope AllUsers -AllowClobber
    Install-Module -Name InstallModuleFromGitHub -Scope AllUsers

    4.2 windows-screenfetch 配置

    windows-screenfetch 已經(jīng)不適用于最新版本的 powershell ,所以需要更改下源碼,找到 C:\Program Files\PowerShell\Modules\windows-screenfetch.0.2下的 Data.psm1文件,將里面所有內(nèi)容替換為下面內(nèi)容:

    Add-Type -AssemblyName System.Windows.Forms
     
    Function Get-SystemSpecifications()
    {
     
        $UserInfo = Get-UserInformation;
        $OS = Get-OS;
        $Kernel = Get-Kernel;
        $Uptime = Get-Uptime;
        $Motherboard = Get-Mobo;
        $Shell = Get-Shell;
        $Displays = Get-Displays;
        $WM = Get-WM;
        $Font = Get-Font;
        $CPU = Get-CPU;
        $GPU = Get-GPU;
        $RAM = Get-RAM;
        $Disks = Get-Disks;
     
     
        [System.Collections.ArrayList] $SystemInfoCollection =        $UserInfo,
            $OS,
            $Kernel,
            $Uptime,
            $Motherboard,
            $Shell,
            $Displays,
            $WM,
            $Font,
            $CPU,
            $GPU,
            $RAM;
     
        foreach ($Disk in $Disks)
        {
            [void]$SystemInfoCollection.Add($Disk);
        }
     
        return $SystemInfoCollection;
    }
     
    Function Get-LineToTitleMappings()
    {
        $TitleMappings = @{
            0 = "";
            1 = "OS: ";
            2 = "Kernel: ";
            3 = "Uptime: ";
            4 = "Motherboard: ";
            5 = "Shell: ";
            6 = "Resolution: ";
            7 = "Window Manager: ";
            8 = "Font: ";
            9 = "CPU: ";
            10 = "GPU ";
            11 = "RAM: ";
        };
     
        return $TitleMappings;
    }
     
    Function Get-UserInformation()
    {
        return $env:USERNAME + "@" + (Get-CimInstance Win32_OperatingSystem).CSName;
    }
     
    Function Get-OS()
    {
        return (Get-CimInstance Win32_OperatingSystem).Caption + " " +
            (Get-CimInstance Win32_OperatingSystem).OSArchitecture;
    }
     
    Function Get-Kernel()
    {
        return (Get-CimInstance  Win32_OperatingSystem).Version;
    }
     
    Function Get-Uptime()
    {
        $Uptime = (Get-CimInstance Win32_OperatingSystem).LocalDateTime - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime;
     
        $FormattedUptime =  $Uptime.Days.ToString() + "d " + $Uptime.Hours.ToString() + "h " + $Uptime.Minutes.ToString() + "m " + $Uptime.Seconds.ToString() + "s ";
        return $FormattedUptime;
    }
     
    Function Get-Mobo()
    {
        $Motherboard = Get-CimInstance Win32_BaseBoard | Select-Object Manufacturer, Product;
        return $Motherboard.Manufacturer + " " + $Motherboard.Product;
     
    }
     
    Function Get-Shell()
    {
        return "PowerShell $($PSVersionTable.PSVersion.ToString())";
    }
     
    Function Get-Displays()
    {
        $Displays = New-Object System.Collections.Generic.List[System.Object];
     
        # This gives the available resolutions
        $monitors = Get-CimInstance -N "root\wmi" -Class WmiMonitorListedSupportedSourceModes
     
        foreach($monitor in $monitors)
        {
            # Sort the available modes by display area (width*height)
            $sortedResolutions = $monitor.MonitorSourceModes | sort -property {$_.HorizontalActivePixels * $_.VerticalActivePixels}
            $maxResolutions = $sortedResolutions | select @{N="MaxRes";E={"$($_.HorizontalActivePixels) x $($_.VerticalActivePixels) "}}
     
            $Displays.Add(($maxResolutions | select -last 1).MaxRes);
        }
     
        return $Displays;
    }
     
    Function Get-WM()
    {
        return "DWM";
    }
     
    Function Get-Font()
    {
        return "Segoe UI";
    }
     
    Function Get-CPU()
    {
        return (((Get-CimInstance Win32_Processor).Name) -replace '\s+', ' ');
    }
     
    Function Get-GPU()
    {
        return (Get-CimInstance Win32_DisplayConfiguration).DeviceName;
    }
     
    Function Get-RAM()
    {
        $FreeRam = ([math]::Truncate((Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory / 1KB));
        $TotalRam = ([math]::Truncate((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1MB));
        $UsedRam = $TotalRam - $FreeRam;
        $FreeRamPercent = ($FreeRam / $TotalRam) * 100;
        $FreeRamPercent = "{0:N0}" -f $FreeRamPercent;
        $UsedRamPercent = ($UsedRam / $TotalRam) * 100;
        $UsedRamPercent = "{0:N0}" -f $UsedRamPercent;
     
        return $UsedRam.ToString() + "MB / " + $TotalRam.ToString() + " MB " + "(" + $UsedRamPercent.ToString() + "%" + ")";
    }
     
    Function Get-Disks()
    {   
        $FormattedDisks = New-Object System.Collections.Generic.List[System.Object];
     
        $NumDisks = (Get-CimInstance Win32_LogicalDisk).Count;
     
        if ($NumDisks)
        {
            for ($i=0; $i -lt ($NumDisks); $i++)
            {
                $DiskID = (Get-CimInstance Win32_LogicalDisk)[$i].DeviceId;
     
                $FreeDiskSize = (Get-CimInstance Win32_LogicalDisk)[$i].FreeSpace
                $FreeDiskSizeGB = $FreeDiskSize / 1073741824;
                $FreeDiskSizeGB = "{0:N0}" -f $FreeDiskSizeGB;
     
                $DiskSize = (Get-CimInstance Win32_LogicalDisk)[$i].Size;
                $DiskSizeGB = $DiskSize / 1073741824;
                $DiskSizeGB = "{0:N0}" -f $DiskSizeGB;
     
                $FreeDiskPercent = ($FreeDiskSizeGB / $DiskSizeGB) * 100;
                $FreeDiskPercent = "{0:N0}" -f $FreeDiskPercent;
     
                $UsedDiskSizeGB = $DiskSizeGB - $FreeDiskSizeGB;
                $UsedDiskPercent = ($UsedDiskSizeGB / $DiskSizeGB) * 100;
                $UsedDiskPercent = "{0:N0}" -f $UsedDiskPercent;
     
                $FormattedDisk = "Disk " + $DiskID.ToString() + " " +
                    $UsedDiskSizeGB.ToString() + "GB" + " / " + $DiskSizeGB.ToString() + "GB " +
                    "(" + $UsedDiskPercent.ToString() + "%" + ")";
                $FormattedDisks.Add($FormattedDisk);
            }
        }
        else
        {
            $DiskID = (Get-CimInstance Win32_LogicalDisk).DeviceId;
     
            $FreeDiskSize = (Get-CimInstance Win32_LogicalDisk).FreeSpace
            $FreeDiskSizeGB = $FreeDiskSize / 1073741824;
            $FreeDiskSizeGB = "{0:N0}" -f $FreeDiskSizeGB;
     
            $DiskSize = (Get-CimInstance Win32_LogicalDisk).Size;
            $DiskSizeGB = $DiskSize / 1073741824;
            $DiskSizeGB = "{0:N0}" -f $DiskSizeGB;
     
            if ($DiskSize -gt 0)
            {
                $FreeDiskPercent = ($FreeDiskSizeGB / $DiskSizeGB) * 100;
                $FreeDiskPercent = "{0:N0}" -f $FreeDiskPercent;
     
                $UsedDiskSizeGB = $DiskSizeGB - $FreeDiskSizeGB;
                $UsedDiskPercent = ($UsedDiskSizeGB / $DiskSizeGB) * 100;
                $UsedDiskPercent = "{0:N0}" -f $UsedDiskPercent;
     
                $FormattedDisk = "Disk " + $DiskID.ToString() + " " +
                    $UsedDiskSizeGB.ToString() + "GB" + " / " + $DiskSizeGB.ToString() + "GB " +
                    "(" + $UsedDiskPercent.ToString() + "%" + ")";
                $FormattedDisks.Add($FormattedDisk);
            }
            else
            {
                $FormattedDisk = "Disk " + $DiskID.ToString() + " Empty";
                $FormattedDisks.Add($FormattedDisk);
            }
        }
     
        return $FormattedDisks;
    }

    4.3 啟動時(shí)加載插件

    為了啟動時(shí)加載插件,我們需要創(chuàng)建一個(gè) Microsoft.PowerShell_profile.ps1文件,放到 C:\Users\自己的用戶名\Documents\PowerShell目錄下,文件內(nèi)容為:

    Import-Module windows-screenfetch
    Import-Module posh-git
    Import-Module posh-sshell
    Import-Module oh-my-posh
    Import-Module git-aliases -DisableNameChecking
    Import-Module PSReadLine
    Import-Module InstallModuleFromGitHub
    Import-Module Get-ChildItemColor
     
    Screenfetch
    Set-PoshPrompt -Theme Material # 設(shè)置主題為 Material
    Set-PSReadlineKeyHandler -Key Tab -Function Complete # 設(shè)置 Tab 鍵補(bǔ)全
    Set-PSReadLineKeyHandler -Key "Ctrl+d" -Function MenuComplete # 設(shè)置 Ctrl+d 為菜單補(bǔ)全和 Intellisense
    Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo # 設(shè)置 Ctrl+z 為撤銷
    Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward # 設(shè)置向上鍵為后向搜索歷史記錄
    Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward # 設(shè)置向下鍵為前向搜索歷史紀(jì)錄

    5 總結(jié)

    Windows Terminal 的安裝與美化到這里就已經(jīng)結(jié)束了,其中 pwsh 安裝的一些插件,如果大家想了解其具體用法,可以去官網(wǎng)查看。

    模塊,準(zhǔn)確的來說,并不是C#的概念,而是微軟的運(yùn)行時(shí)環(huán)境CLR的概念。想要學(xué)好C#斷然不能只是會使用VS之類的IDE寫寫代碼然后編譯運(yùn)行,很多相關(guān)的概念我們也需要去了解。

    這一節(jié),我們就簡單討論下C#模塊。

    其實(shí)C#模塊,我們幾乎每天都需要接觸到(如果我們每天都需要寫C#代碼并且進(jìn)行編譯的話),每次我們對一個(gè)C#類(class)進(jìn)行編譯都會生成模塊。

    csc編譯獲得模塊

    下面,我們以經(jīng)典的hello world為例。

    1. 創(chuàng)建一個(gè)Program.cs文件,內(nèi)容只是簡單的向控制臺輸出hello world:
    public sealed class Program{
    	public static void Main() {
    		System.Console.WriteLine("hello world");
    	}
    }
    1. 使用csc.exe 對文件進(jìn)行編譯:
    csc.exe /out:Program.exe /t:exe /r:MSCorLib.dll Program.cs

    如果以上命令運(yùn)行成功的話,我們會在源文件的文件夾中得到一個(gè)Program.exe的文件。這個(gè)Program.exe 就是一個(gè)標(biāo)準(zhǔn)的PE32或者PE32+的文件(PE32+對應(yīng)的是64位,這里沒有PE64),也就是一個(gè)C#模塊。

    在繼續(xù)講解C#模塊之前, 我們先來看看上面這個(gè)編譯命令,這個(gè)命令還是有點(diǎn)意思的。

    /out:Program.exe 告訴了編譯器我們最后需要生成的是一個(gè)exe文件。

    /t:exe 看起來和上一個(gè)out參數(shù)似乎有些重復(fù),這也是這個(gè)參數(shù)比較迷惑人的地方,t其實(shí)代表的是target,exe其實(shí)只是指代了沒有圖形界面的應(yīng)用程序。如果是我們平常使用的比如迅雷之類的應(yīng)用那么使用的就應(yīng)該是winexe。這種類型是具有圖形界面的。

    /r:MSCorLib.dll,r這里是reference,是為了聲明編譯Program.cs我們需要使用到定義在MSCorLib.dll 中的某些類型(在我們的例子中就是Console)。

    Response文件

    有心的朋友可能會發(fā)現(xiàn),其實(shí)我們并不需要聲明MSCorLib.dll的引用,直接使用如下命令,也能夠編譯成功。

    csc.exe /out:Program.exe /t:exe Program.cs

    事實(shí)上確實(shí)如此,為了方便進(jìn)行編譯,而不需要每次都輸入一串參數(shù),csc允許我們使用Response文件來提供參數(shù)。

    因此我們可以把剛剛使用到的三個(gè)參數(shù)全部放到response 文件中并保存為Program.rsp,這個(gè)文件內(nèi)容如下:

    /out: Program.exe (這里的紅色沒有任何特殊含義,我確定頭條編輯器為何將此行變紅)
    /t:exe
    /r:MSCorLib.dll

    然后運(yùn)行如下命令,也可以得到同樣的結(jié)果。

    csc.exe @Program.rsp Program.cs

    參數(shù)覆蓋規(guī)則

    聰明的朋友肯定又發(fā)現(xiàn)了,可是我們之前并沒有定義response文件,為什么我們還是可以不指定引用。這個(gè)原因就在于,csc自帶了一個(gè)全局默認(rèn)的response文件。我們可以在csc的安裝目錄中找到這個(gè)csc.rsp文件。而這個(gè)csc.rsp文件就包含了許多系統(tǒng)自帶的常用的引用。因此我們并不需要去聲明這些引用。

    老白使用的是VS2019安裝的版本,因此csc.exe文件可以在“C:\Program Files (x86)\Microsoft Visual Studio19\Community\MSBuild\Current\Bin\Roslyn\”路徑中找到,同樣的,這個(gè)文件夾也包含了csc.rsp文件。

    既然存在多個(gè)地方可以進(jìn)行配置,那必然會存在優(yōu)先級的問題。想必聰明的朋友已經(jīng)想到了,csc采用的是以下順序獲取參數(shù),一旦獲得需要的參數(shù)就不再向下查找:

    1. 命令行中帶的參數(shù)
    2. 本地傳入命令行的response文件中的參數(shù)
    3. 全局的csc.rsp中的參數(shù)

    模塊內(nèi)容

    通過csc編譯出來的模塊,需要使用CLR進(jìn)行運(yùn)行。那么一個(gè)模塊是怎么讓CLR知道應(yīng)該怎么進(jìn)行處理的呢?這就需要我們看看模塊到底包含了哪些信息了。

    PE32/PE32+的頭文件

    頭文件這個(gè)東西,名字很有意思,其實(shí)也非常準(zhǔn)確,一般來說我們看到一個(gè)人的“頭”就能知道這個(gè)人是誰(who),大致的年齡(how old,簡稱how),雖然不準(zhǔn)確但是靈魂三問已經(jīng)完成兩問了。

    同樣的,PE32/PE32+頭文件也給我們提供了這些信息。頭文件里包含了PE文件類型的信息(who),我們可以知道這是一個(gè)GUI文件還是一個(gè)普通DLL等等。此外也包含了文件創(chuàng)建信息(how old)。如果這個(gè)PE頭文件使用了PE32的格式,那么就可以在32位或者64位的Windows上運(yùn)行。如果使用的是PE32+的格式,那么只能在64位的Windows上運(yùn)行。

    CLR 頭文件

    如果說PE32/PE32+頭文件沒什么用途的話(事實(shí)上也確實(shí)如此,CLR大部分情況下并不使用PE頭文件),那么CLR頭文件則是包含了CLR運(yùn)行此文件的必要信息。幾個(gè)主要的信息包括了,所需要的CLR版本,模塊的入口函數(shù),模塊的metadata數(shù)據(jù)位置和大小等等。

    元數(shù)據(jù)(metadata)

    主要包含了兩部分,一部分是這個(gè)模塊本身所包含的類型(type)和成員(member)。另外一部分描述了這個(gè)模塊會引用到類型和成員信息。

    IL 代碼

    整個(gè)模塊的核心部分,是編譯器編譯C#源碼所生成的中間代碼。在運(yùn)行時(shí),IL代碼會被CLR編譯成cpu指令。

    這就是一個(gè)模塊所包含的4個(gè)部分。這里比較重要的一點(diǎn)是這四個(gè)部分都是相互耦合在一起的,這樣就能夠保證元數(shù)據(jù)和IL代碼之間不會出現(xiàn)不同步的問題。

    此外,可能有很多同學(xué)都會有困惑,為啥已經(jīng)有了IL代碼了,其實(shí)就能夠知道這個(gè)模塊本身所包含的類型和成員也能之后引用了哪些其他模塊,為啥還需要元數(shù)據(jù)呢?我的理解也不一定準(zhǔn)確,但是很大一個(gè)作用就是GC可以通過閱讀元數(shù)據(jù)來很快的判斷哪些類型之間有引用,從而判斷是否需要進(jìn)行GC。此外,我們編寫的源碼,在進(jìn)行編譯的時(shí)候,編譯器也能夠很快的通過元數(shù)據(jù)來判斷我們的源碼是否合規(guī)。

    好了,到此,老白就將如何(手動)產(chǎn)生一個(gè)模塊以及模塊的組成說完了。如果有什么問題,歡迎大家和老白一起探討。

    碼字不易,如果覺得有用或者喜歡老白的內(nèi)容,歡迎點(diǎn)贊收藏關(guān)注。

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有