使用PowerShell 自动安装.NET4.6.1离线包

自动安装脚本在文章末尾

自动安装脚本在文章末尾

自动安装脚本在文章末尾

运行环境:Windows Server 2012 R2

开发环境:Win10

Microsoft .NET Framework 4.6.1离线安装包:下载地址

需要注意的是win10能运行的脚本在2012上不一定能运行,所以要把写好的脚本在2012上确保运行。

为了确保安装,需要提前做一些判断

一、获取已安装软件列表

这些判断借鉴了 示例(传送门),可以下载运行试试,但在我的2012不能直接使用

这里  Get-WmiObject -Class "win32_product"  在2012上运行无效

然后百度到使用注册表获取安装的软件列表  参考链接

‘HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall’
‘HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall’
‘HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall’

代码在这里,但win10运行速度超快??(比Get-WmiObject快很多),在2012上找不到注册表目录

<#
.Synopsis
   Get installed software list by retrieving registry.
.DESCRIPTION
   The function return a installed software list by retrieving registry from below path;
   1.‘HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall‘
   2.‘HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall‘
   3.‘HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall‘
   Author: Mosser Lee (http://www.pstips.net/author/mosser/)
.EXAMPLE
   Get-InstalledSoftwares
.EXAMPLE
   Get-InstalledSoftwares  | Group-Object Publisher
#>
function Get-InstalledSoftwares
{
    #
    # Read registry key as product entity.
    #
    function ConvertTo-ProductEntity
    {
        param([Microsoft.Win32.RegistryKey]$RegKey)
        $product = ‘‘ | select Name,Publisher,Version
        $product.Name =  $_.GetValue("DisplayName")
        $product.Publisher = $_.GetValue("Publisher")
        $product.Version =  $_.GetValue("DisplayVersion")

        if( -not [string]::IsNullOrEmpty($product.Name)){
            $product
        }
    }

    $UninstallPaths = @(,
    # For local machine.
    ‘HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall‘,
    # For current user.
    ‘HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall‘)

    # For 32bit softwares that were installed on 64bit operating system.
    if([Environment]::Is64BitOperatingSystem) {
        $UninstallPaths += ‘HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall‘
    }
    $UninstallPaths | foreach {
        Get-ChildItem $_ | foreach {
            ConvertTo-ProductEntity -RegKey $_
        }
    }
}

由于安装framework之前必须要确认是否存在,无奈偷个懒,也是读取注册表??

这次直接读取下边的注册表,获取所有已安装的framework版本号??,完美结果

HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full# 用法Get-ItemProperty ‘HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full‘ -Name Version

二、安装进度条显示

下一个问题就是按软件安装时,由于安装时间很长,容易认为脚本假死,所以加个进度条,但是进度条需要获取安装进度,这里未百度到如何获取安装程序的进度,所以又偷懒了??

安装时无限循环进度条来响应

安装完成后隐藏进度条

function Show-Progress ($file, $arguments){
    $process = Start-Process $file $arguments -Verb RunAs -PassThru
    for($i = 0; $i -le 100; $i = ($i + 1) % 100)
    {
        Write-Progress -Activity "正在安装" -PercentComplete $i
        Start-Sleep -Milliseconds 100
        if ($process.HasExited) {
            Write-Progress -Activity "Installer" -Completed
            if ($process.HasExited) {
                if ($process.ExitCode -eq 3010) {
                    Write-Host "成功安装。"
                }
                break
            }
        }
    }
}

三、安装离线包错误5100

这个问题好解决点,就是系统未安装更新包(Windows Server 2012 R2 Update (KB2919355)),所以不能安装高级的framework版本

安装顺序如下

1、KB2919442    下载链接

2、clearcompressionflag.exe    下载链接

3、KB2919355    下载链接

至此,脚本写好

自动安装Microsoft .NET Framework 4.6.1的PowerShell脚本代码

# 自动安装.net4.6.1
Set-ExecutionPolicy -Force remotesigned
# 获取当前脚本绝对路径
$path = Split-Path -Parent $MyInvocation.MyCommand.Definition;
$Net = "\NDP461-KB3102436-x86-x64-AllOS-ENU.exe";
Set-Location $path;

function Show-Progress ($file, $arguments){
    $process = Start-Process $file $arguments -Verb RunAs -PassThru
    for($i = 0; $i -le 100; $i = ($i + 1) % 100)
    {
        Write-Progress -Activity "正在安装 Microsoft .NET Framework 4.6.1" -PercentComplete $i
        Start-Sleep -Milliseconds 100
        if ($process.HasExited) {
            Write-Progress -Activity "Installer" -Completed
            if ($process.HasExited) {
                # 提示安装状态
                if ($process.ExitCode -eq 3010) {
                    Write-Host "成功安装Microsoft.NET Framework 4.6.1。"
                    shutdown -r -t 20
                }elseif ($process.ExitCode -ne 0) {
                    Write-Warning "安装过程返回错误代码: $($process.ExitCode)";
                }elseIf(((Get-ItemProperty ‘HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full‘ -Name Version).Version | Where-Object {$_ -ge "4.6"}) -eq $null) {
                    Write-Host "成功安装Microsoft.NET Framework 4.6.1。"
                    shutdown -r -t 20
                }
                else{
                    Write-Warning "安装Microsoft.NET Framework 4.6.1失败,可以在$$file中找到它并手动安装。";
                }
                break
            }
        }
    }
}
function InstallNet ($filepath,$filename){
    # 检查当前系统是否已安装.net4.6.1或更高版本
    If(((Get-ItemProperty ‘HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full‘ -Name Version).Version | Where-Object {$_ -ge "4.6"}) -eq $null) {
    # If($true) {
        $NetFxPath = $filepath + $filename;
        #验证安装文件是否存在
        If(Test-Path -Path $NetFxPath) {
            Write-Host "正在安装 Microsoft .NET Framework 4.6.1 ..."
            Show-Progress $NetFxPath "/q /norestart"
        }
        Else {
            Write-Warning "找不到Microsoft.NET Framework 4.6.1安装包。"
        }
    }
    Else {
        Write-Host "这台计算机中已经安装了 .NET Framework 4.6.1 或版本更高的更新。"
    }
}
InstallNet $path $Net

原文地址:https://www.cnblogs.com/GoCircle/p/11225598.html

时间: 2024-11-02 00:36:30

使用PowerShell 自动安装.NET4.6.1离线包的相关文章

使用PowerShell 自动安装VC++补丁

执行环境:Windows Server 2012 R2 VC++下载链接 这里有个问题,虽说可以静默安装,但是未对当前系统检测是否已安装vc++补丁,望大佬指点 # 自动安装 Set-ExecutionPolicy -Force remotesigned # 获取当前脚本绝对路径 $path = Split-Path -Parent $MyInvocation.MyCommand.Definition; $Net = "\vcredist_x64.exe"; Set-Location

利用Powershell自动部署asp.net mvc网站项目 (一)

这一篇中我们会写一些关于自动化部署的代码.我们会使用 Powershell 书写这类代码. 你将发现这篇文章中涉及的东西非常具体,有的要求甚至相当苛刻且可能不具有通用性.这是因为部署从来都是跟环境打交道,部署过程中协作的组建太多,相互之间的交集不可能太大.可能唯一能够通用的是自动化部署的基本原则(只是这篇文章的基本原则): 每一次自动化部署结束之后,应用程序都会有相同的初始状态. 自动化部署的机器非常干净,只有相应的 Windows Server 系统和 .NET Framework.尤其是,不

Tip:Exchange DAG部署的时候自动安装群集组件

我们在启用DAG高可用性组的时候,不需要手动先去安装failover cluster组件,在启用DAG的时候会自动安装该组件,如图. 该组件自动安装后,再继续配置DAG. ==============================================

自动化运维之-PXE实现系统批量自动安装

本节索引 需求分析 PXE简介 整体方案 服务选择 功能实现 安装调试 错误分析 总结 1 需求分析 随着互联网技术的不断壮大,服务器数量也在不断的增加,IT运维已经成为IT服务内涵中重要的组成部分.面对越来越复杂的业务,面对越来越多样化的用户需求,不断扩展的IT应用需要越来越合理的模式来保障IT服务能灵活便捷.安全稳定地持续保障,这种模式中的保障因素就是IT运维.从初期的几台服务器发展到庞大的数据中心,单靠人工已经无法满足在技术.业务.管理等方面的要求,那么标准化.自动化.架构优化.过程优化等

Azure 基础:用 PowerShell 自动登录

PowerShell 是管理 Azure 的最好方式,因为我们可以使用脚本把很多的工作自动化.比如把 Azure 上的虚拟机关机,并在适当的时间把它开机,这样我们就能节省一些开支,当然我们同时也为减少二氧化碳的排放做出了贡献! PowerShell 的 Azure 模块中为我们提供了不同的 API, 早期的叫 ASM(Azure Service Manager).随着 Azure 的发展变化,又出现了一套新的 API 叫 ARM(Azure Resource Management).我们这里仅介

mysql自动安装脚本

为适应自己工作习惯和需要,花一点时间写了一个mysql自动安装脚本,供大家参考学习. 注意: 1.需要先安装cmake 2.数据库版本需要在第二步安装mysql时修改 3.该脚本是以root用户安装并启动 脚本内容如下: ######################################################################## #mysql自动安装脚本,其中变量/mysql_v_dir/和/port/可根据实际需要修改    # #执行脚本命令:sh mys

西部开源学习笔记BOOK2《自动安装系统》

############################# #####  unit1自动安装系统 ##### ############################# ################################### #### Network Install(HTTP,FTP,NFS) #### ################################### #######1.kickstart脚本###### kickstart脚本是自动应答系统在安装过程中一切

自动安装虚拟机之网络安装和pxe安装

####1.kickstart脚本 Kickstart 概述 使用 kickstart, 系统管理员可以创建一个包含安装期间所有常见问题的答案的文件 , 以自动安装 Red Hat Enterprise Linux Kickstart 类似于 Oracle solaris 中的Jumpstart 或 Microsoft Windows 的无人值守安装 kickstart脚本是自动应答系统在安装过程中一切问题的脚本文件 这个文件可以实现系统的自动安装 在系统安装完毕后会在系统的root家目录中生成

CentOS 7.2 PowerShell下安装Azure Module

目前Linux版本的PowerShell还是Alpha版本,所以很多功能不能使用. 比如通过Powershell命令:install-module AzureRM在线安装Azure的Module.但我们可以通过变通的方式实现对Azure组件的安装: 1. 如前文中所述,安装PowerShell,或者在下载rpm安装包后,用yum安装: yum install ./powershell-6.0.0_alpha.9-1.el7.centos.x86_64.rpm 2. 安装完成后,创建PowerSh