当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 Windows 终端进行 PowerShell 概念验证

作者:精品下载站 日期:2024-12-14 07:55:23 浏览:17 分类:玩电脑

使用 Windows 终端进行 PowerShell 概念验证


我最近将我的 Windows 10 系统更新到了 1903 版本。原因之一是我想尝试一下新的 Windows 终端预览。您可以在 Windows 应用商店中找到它。这是前沿的东西,远未完成,但有望成为一个很好的补充。现在,您将能够在一个选项卡式应用程序中拥有所有命令终端,并能够轻松地在它们之间进行切换。正如我所说,这远不是成品。现在,如果您想添加新的配置文件,即另一个终端,您必须手动编辑 json 文件。如果您安装了 VS Code,该文件将在其中打开。否则,我假设您将获得与 .json 扩展名关联的任何应用程序。

我不介意 json 格式,因为我可以通过 PowerShell 使用它。虽然有些人希望有一个图形配置文件编辑器,但我也很高兴使用 PowerShell。为此,我组合了一个函数来将新配置文件添加到您的profiles.json 文件中。与 Windows Terminal 一样,这绝对是一项正在进行中的工作,远未完成。但我可以预见,一旦 Windows 终端更加成熟,我就会编写一个模块来管理它。

现在,您可以在 Github gist 中找到该函数。

New-WindowsTerminalProfile.ps1:


Function New-WindowsTerminalProfile {
    [cmdletbinding(SupportsShouldProcess)]
    Param(
        [Parameter(Position = 0, Mandatory)]
        [ValidateNotNullOrEmpty()]
        [alias("name")]
        [string]$ProfileName,
        [Parameter( Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$Commandline,
        [string]$StartingDirectory,
        [ValidateSet("Campbell", "Solarized Light", "SolarizedDark", "One Half Dark", "One Half Light")]
        [string]$ColorScheme = "Campbell",
        [string]$FontFace = "Consolas",
        [int32]$FontSize = 10,
        [ValidateSet("bar", "emptyBox", "filledBox", "underscore", "vintage")]
        #cursor shape values are case sensitive
        [string]$CursorShape = "bar",
        [ValidatePattern("^#\w{6}$")]
        [string]$CursorColor = "#FFFFFF",
        [validateSet("PowerShell", "Linux", "CMD")]
        [string]$Icon = "PowerShell",
        [Validatescript( {Test-Path $_})]
        [string]$BackgroundImage,
        [ValidateSet("none", "fill", "uniform", "uniformtofill")]
        [string]$StretchMode = "uniform",
        [double]$Opacity = 0.9,
        [switch]$EnableOpacity
    )
    Begin {
        Write-Verbose "[$((Get-Date).TimeofDay) BEGIN  ] Starting $($myinvocation.mycommand)"
        #get the profiles.json file
        $Path = (Get-Childitem $env:localappdata\packages\Microsoft.WindowsTerminal*\profiles.json -Recurse).fullname
        Write-Verbose "[$((Get-Date).TimeofDay) BEGIN  ] Getting settings from $Path"
        #get the current settings
        $settings = Get-content -Path $path | ConvertFrom-Json

        #private helper function
        Function _getdatestamp {
            (Get-Date -format s).replace(":", "_")
        }
    } #begin

    Process {
        Write-Verbose "[$((Get-Date).TimeofDay) PROCESS] Creating terminal profile $ProfileName "
        Write-Verbose "[$((Get-Date).TimeofDay) PROCESS] Using icon for $icon"
        switch ($Icon) {

            "Powershell" { $iconpath = "ms-appx:///ProfileIcons/{61c54bbd-c2c6-5271-96e7-009a87ff44bf}.png"}
            "Linux" { $iconpath = "ms-appx:///ProfileIcons/{9acb9455-ca41-5af7-950f-6bca1bc9722f}.scale-100.png"}
            "CMD" { $iconpath = "ms-appx:///ProfileIcons/{0caa0dad-35be-5f56-a8ff-afceeeaa6101}.png"}
        }

        $guid = New-Guid

        $new = @{
            acrylicOpacity = $Opacity
            closeOnExit    = $True
            colorScheme    = $ColorScheme
            commandline    = $commandline
            cursorColor    = $CursorColor
            cursorShape    = $CursorShape
            fontFace       = $FontFace
            fontSize       = $FontSize
            guid           = "{$guid}"
            historySize    = 9001
            icon           = $iconPath
            name           = $ProfileName
            padding        = "0, 0, 0, 0"
            snapOnInput    = $True
            useAcrylic     = $EnableOpacity.ToBool()
        }

        if ($StartingDirectory) {
            Write-Verbose "[$((Get-Date).TimeofDay) PROCESS]  Setting Starting Directory to $StartingDirectory"
            #escape slashes in the path
            $new.add("startingDirectory", $StartingDirectory)
        }
        if ($BackgroundImage) {
            Write-Verbose "[$((Get-Date).TimeofDay) PROCESS] Adding background image $BackgroundImage"
            $new.Add("backgroundImage", $BackgroundImage)
            $new.Add("backgroundImageStretchMode", $StretchMode)
            $new.useAcrylic = $False
        }

        $newprof = New-Object -typename PSObject -property $new

        $settings.profiles += $newprof

        $out = [PSCustomobject]@{
            globals  = $settings.globals
            profiles = $settings.profiles
            schemes  = $settings.schemes
        }

        if ($pscmdlet.ShouldProcess($($newProf | Out-String))) {
            $parent = Split-Path -path $path
            $backpath = Join-Path -Path $parent -ChildPath "profiles_$(_getdatestamp).json"
            Write-Verbose "[$((Get-Date).TimeofDay) PROCESS] Creating a backup copy of $Path to $Backpath"

            Copy-item -path $path -Destination $backpath

            Write-Verbose "[$((Get-Date).TimeofDay) PROCESS] Writing updates to $Path"
            $out | ConvertTo-Json -depth 3  | Out-File -FilePath $path
        } #if should process
    } #process

    End {
        Write-Verbose "[$((Get-Date).TimeofDay) END    ] Ending $($myinvocation.mycommand)"
    } #end

} #close New-WindowsTerminalProfile

据我所知,json 文件结构区分大小写,因此如果要设置具有 ValidateSet 属性的参数,请让 PowerShell 选项卡完成该值。现在,我正在使用默认配置文件中的配色方案。在某些时候,从profiles.json 文件中提取定义的方案是有意义的,而且并不困难。该命令将为您提供一些不错的详细信息并支持 -WhatIf。我还添加了在同一目录中创建 profile.json 副本的功能,但文件名类似于profiles_2019-07-08T11_10_48.json。

使用该功能,您可以创建一个新的终端配置文件,如下所示:

New-WindowsTerminalProfile -ProfileName Netsh -Commandline "cmd /c netsh" -Icon CMD -CursorShape vintage -CursorColor '#008080' -Opacity 0.8 -EnableOpacity -FontSize 18 -verbose

结果如下:

[玩转系统] 使用 Windows 终端进行 PowerShell 概念验证

现在,我将编辑profiles.json 文件来微调终端设置。

我希望 Windows Terminal 继续发展,并期待创建 PowerShell 命令以使其变得更加出色!享受。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯