code365scripts.core.psm1

<#
.SYNOPSIS
    升级 PowerShell 到最新版本
.DESCRIPTION
    目前 Windows 默认安装的 PowerShell 版本是 5.1,这个版本是只能在 Windows 上面运行的。后来,微软开发了一个可以跨平台的 PowerShell 版本,从 6.0 开始编号。这个版本可以在 Windows, Mac, Liunx 等多个平台运行,并且这个版本经常更新,目前的版本号是 7.1.3。
    更新 PowerShell 版本本身并不难,你在打开 PowerShell 窗口时就会有提示,然后通过一个网址,你可以下载,然后安装。
    但是如果你觉得这个过程还是比较繁琐的话,你可以简单地通过 `Update-Powershell` 这个命令来完成,甚至可以用 `up` 这个快捷指令即可。
.LINK
    https://github.com/code365opensource/code365scripts/tree/master/code365scripts
#>

function Update-Powershell {
    [Alias("up")]
    [CmdletBinding()]
    param ()

    process {
        Set-ExecutionPolicy Bypass -Scope Process -Force
        Invoke-Expression "& {$(Invoke-Restmethod https://aka.ms/Install-PowerShell.ps1)} -Quiet -AddExplorerContextMenu"
    }
}

<#
.SYNOPSIS
    安装新的机器环境
.DESCRIPTION
   这是我最喜欢用的一个脚本,我自己有一个习惯,就是隔一段时间就重装一下系统(例如半年),那么当你拿到一个新的干净的机器,如何快速地把你喜爱的一些程序都安装起来呢?
   我采取的方法是通过 [choco](https://chocolatey.org/) 这个工具来批量安装应用,绝大部分常见的软件在这里都有。关于如何查找这些软件,你可以参考这里 <https://chocolatey.org/packages>
   例如你要安装几个工具,`vscode,7zip,git`等,你可以用核心模块中下面这个命令来实现
   `Install-Machine -apps vscode,7zip,git`
   是不是很容易呢?你甚至可以用 `im -apps vscode,7zip,git`这样的快捷方式。
   为了帮助大家更好地重用,这个工具支持加载预定义的一些应用集合,例如我定义了一个给开发人员用的集合,叫 `dev`,这里面包含了我自己常用的一些软件。如果你想直接使用,那么就可以输入 `im -apps dev -useDefault` 即可。未来还可以支持更多的场景,欢迎大家给我提反馈,https://github.com/code365opensource/code365scripts/discussions/1

   如果你安装英文系统,但是要一次性添加中文输入法,并且将其设置为默认输入法(初始输入为英文状态),字体输入提示变大,请使用 -setupChineseInput 这个开关
   如果你要删除掉一些不常用的功能,请使用 -disableOptionalFeatures 这个开关
   如果你要删除掉一些不常用的UWP(Windows Store中的应用),请使用 -removeUWPs这个开关
.EXAMPLE
    PS C:\> Install-Machine -apps vscode,git,7zip
    这是常规用法,安装以上四个应用
.EXAMPLE
    PS C:\> im -apps vscode,git,7zip
    这是简写用法,安装以上四个应用
.EXAMPLE
    PS C:\> im -apps dev -useDefault
    这是安装服务器端定义好的dev这个场景的应用集合。还支持其他更多自定义集合。
.LINK
    https://github.com/code365opensource/code365scripts/tree/master/code365scripts
#>

function Install-Machine {
    [Alias("im")]
    param(
        [string[]]$apps,
        [switch]$useDefault,
        [switch]$setupChineseInput,
        [switch]$disableOptionalFeatures,
        [switch]$removeUWPs
    )

    $confirm = Read-Host -Prompt "Please run powershell in Administrator mode [y/N]"

    if ($confirm.ToLower() -ne "y") {
        return
    }

    Set-ExecutionPolicy Bypass -Scope Process -Force
    
    if ($setupChineseInput) {
    
        # 添加中文输入法
        $languagelist = Get-WinUserLanguageList
        $languagelist.add("zh-CN")
        Set-WinUserLanguageList $languagelist -Force

        # 设置默认输入法为中文
        Set-WinDefaultInputMethodOverride -InputTip "0804:{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E}{FA550B04-5AD7-411F-A5AC-CA038EC515D7}"

        # 设置系统默认语言为中文
        Set-winsystemlocale -SystemLocale zh-CN

        # 设置时区为中国
        Set-TimeZone -Name "China Standard Time"

        # 设置资源管理器中,显示文件扩展名
        Push-Location
        Set-Location HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
        Set-ItemProperty . HideFileExt "0"
        Pop-Location

        # 设置输入法默认为英文

        Push-Location
        Set-Location HKCU:\SOFTWARE\Microsoft\InputMethod\Settings\CHS
        Set-ItemProperty . "Default Mode" "1"
        Pop-Location

        # 输入法字体设置大一些
        # Push-Location
        # Set-Location HKCU:\SOFTWARE\Microsoft\InputMethod\CandidateWindow\CHS\1
        # Set-ItemProperty . FontStyle "32.00pt;Regular;;Microsoft YaHei UI"
        # Set-ItemProperty . "Default Mode" "1"
        # Pop-Location

    }

    if ($useDefault) {
        # $config = Invoke-Restmethod "https://github.com/code365opensource/code365scripts/raw/master/code365scripts.core/config.json"
        $config = Get-Content -Path "$PSScriptRoot\config.json" | ConvertFrom-Json
        $apps = $config.defaultapps."$apps"
    }

    if ($apps) {
        if (!(Test-Path "$env:programdata\chocoportable\bin\choco.exe")) {
            Invoke-Expression "& {$(Invoke-Restmethod https://chocolatey.org/install.ps1)}"
        }

        $list = Invoke-Expression "choco list --localonly"

        foreach ($item in $apps) {
            $found = $list -like "$item*"
            if ($null -ne $found) {
                Invoke-Expression "choco upgrade $item -y"
            }
            else {
                Invoke-Expression "choco install $item -y"
            }
        }
    }



    # 禁用所有的可选功能
    if ($disableOptionalFeatures) {
        Get-WindowsOptionalFeature -Online | Where-Object { $_.State -eq "Enabled" } | Disable-WindowsOptionalFeature -Online -NoRestart
        $removeCapabilities = 
        "App.StepsRecorder",
        "App.Support.QuickAssist",
        "Browser.InternetExplorer",
        "DirectX.Configuration.Database",
        "Hello.Face",
        "Language.Handwriting",
        "Language.OCR",
        "Language.Speech",
        "Language.TextToSpeech",
        "MathRecognizer",
        "Media.WindowsMediaPlayer",
        "Microsoft.Windows.MSPaint",
        "Microsoft.Windows.PowerShell.ISE",
        "Microsoft.Windows.WordPad",
        "OpenSSH.Client",
        "Print.Management.Console",
        "Windows.Client.ShellComponents",
        "Language.Fonts.Hans",
        "Print.Fax.Scan";

        $removeCapabilities | ForEach-Object {
            Get-WindowsCapability -Name "$($_)*" -Online `
            | Where-Object { $_.State -eq "Installed" } `
            | ForEach-Object {
                Remove-WindowsCapability -Name $_ -Online
            }
        }
    }


    # 删除不用的UWP
    if ($removeUWPs) {
        $apps = "Microsoft.People,Microsoft.Office.OneNote,Microsoft.YourPhone,Microsoft.PowerAutomateDesktop,Microsoft.Todos,Microsoft.BingNews,MicrosoftTeams,Microsoft.BingWeather,Microsoft.Getstarted,Microsoft.MicrosoftOfficeHub,Microsoft.WindowsCamera,Microsoft.WindowsCalculator,Microsoft.Xbox.TCUI,Microsoft.XboxGamingOverlay,Microsoft.WindowsAlarms,Microsoft.ZuneVideo,Microsoft.XboxSpeechToTextOverlay,Microsoft.SkypeApp,Microsoft.WindowsMaps,Microsoft.WindowsFeedbackHub,Microsoft.XboxApp,Microsoft.MicrosoftStickyNotes,Microsoft.XboxGameOverlay,Microsoft.MicrosoftSolitaireCollection,Microsoft.MSPaint,Microsoft.Microsoft3DViewer,Microsoft.Wallet,Microsoft.ZuneMusic,microsoft.windowscommunicationsapps,Microsoft.MixedReality.Portal,Microsoft.GetHelp,Microsoft.WindowsSoundRecorder,Microsoft.549981C3F5F10"

        $apps.split(",") | ForEach-Object {
            Get-AppxPackage -Name $_ | Remove-AppxPackage
        }
    }
    
    # 重启电脑
    Restart-Computer
}

# 自动更新Powershell模块(默认更新code365scripts这几个模块,可以加入到powershell启动时运行)


<#
.SYNOPSIS
    设置Word,Excel,PowerPoint的默认字体为微软雅黑
#>

function Set-OfficeDefaultFont {
    $confirm = Read-Host -Prompt "Please run powershell in Administrator mode [y/N]"
    if ($confirm.ToLower() -ne "y") {
        return
    }

    $path = "$home\AppData\Roaming\Microsoft\Templates"
    # $wc = New-Object System.Net.WebClient
    
    Write-Host "Set Powerpoint template"

    Copy-Item -Path "$PSScriptRoot\templates\blank.potx" -Destination "$path\blank.potx" -Force
    # $wc.DownloadFile("https://github.com/code365opensource/code365scripts/blob/master/code365scripts.core/templates/Blank.potx?raw=true", "$path\blank.potx")


    Write-Host "Set Word template"
    Copy-Item -Path "$PSScriptRoot\templates\Normal.dotm" -Destination "$path\Normal.dotm" -Force

    # $wc.DownloadFile("https://github.com/code365opensource/code365scripts/blob/master/code365scripts.core/templates/Normal.dotm?raw=true", "$path\normal.dotm")

    Write-Host "Set Excel options"

    $location = Get-Location
    Set-Location "HKCU:"
    Set-ItemProperty -Path "HKEY_CURRENT_USER\software\microsoft\office\16.0\excel\options" -Name "font" -Value "Microsoft YaHei UI,11" -Type String
    set-location $location

    
}