###################功能说明#####################
###该脚本用来对离线VHD文件更新,导入系统补丁####
################################################

#####################################################实现过程#####################################################
#1.使用Diskpart命令挂载VHD文件,该VHD必须包含系统保留分区,OS默认所在第二个分区 #
#2.使用DISM命令将补丁更新(.cab、.msu)导入到VHD文件中,并将日志输出到当前目录下 #
#3.卸载VHD文件 #
##################################################################################################################

#指定VHD文件存放位置
$VHD_File = "e:\vhd\test\win2008r2.vhdx"
#指定补丁文件存放位置
$Updates_Folder = "E:\vhd\Kb"
#指定VHD挂载后的OS分区盘符
$DriveLetter = "U"

#DISM命令日志存放于当前脚本目录下
$CurrentPath = $MyInvocation.MyCommand.Path.substring(0,$MyInvocation.MyCommand.Path.LastIndexOf('\')+1)
#$today = Get-Date -UFormat "%Y%m%d"
#如果将dism过程输出到Log,则当前屏幕无显示
#$DISM_Log = $CurrentPath+"Dism_$today.txt"

#使用Diskpart命令挂载VHD ,并指定盘符(注:该VHD必须包含系统保留分区,否则所选择的分区会不正确,需要使用 partition 1)
Function Diskpart_Mount ($DriveLetter,$VHD_File)
{
$now = get-date -format 'yyyyMMddHHmm'
$dpmountcmd_ScriptName = "DPMount_script_" + $now + ".txt"
$dpmountcmd_ScriptPath = Join-Path -Path $CurrentPath -ChildPath $dpmountcmd_ScriptName
$dpmountcmd = @()
$dpmountcmd += ("Select Vdisk file" + " = """ + $VHD_File + """")
$dpmountcmd += ("Attach Vdisk")
#系统保留分区默认为Partition 1,OS所在分区默认为Partition 2
$dpmountcmd += ("Select Partition 2")
$dpmountcmd += ("Assign letter=" + $DriveLetter)
$dpmountcmd += ("Exit")
Set-Content -Path $dpmountcmd_ScriptPath -Value $dpmountcmd
Diskpart -s $dpmountcmd_ScriptPath
}

#使用Diskpart命令卸载VHD
Function Diskpart_Unmount ($VHD_File)
{
$now = get-date -format 'yyyyMMddHHmm'
$dpunmountcmd_ScriptName = "DPUnmount_script_" + $now + ".txt"
$dpunmountcmd_ScriptPath = Join-Path -Path $CurrentPath -ChildPath $dpunmountcmd_ScriptName
$dpunmountcmd = @()
$dpunmountcmd += ("Select Vdisk file" + " = """ + $VHD_File + """")
$dpunmountcmd += ("Detach Vdisk")
$dpunmountcmd += ("Exit")
Set-Content -Path $dpunmountcmd_ScriptPath -Value $dpunmountcmd
Diskpart -s $dpunmountcmd_ScriptPath
}

#生成添加补丁更新的DISM命令
Function Add_Updates ($Updates_Folder)
{
$Updates = gci $Updates_Folder |? {$_.Extension -eq ".msu" -or $_.Extension -eq ".cab"} |Select Fullname
Foreach ($Update in $Updates)
{
$DISMcmd += "dism /Image:" + $letter + " /Add-Package /PackagePath:" + $Update.Fullname + " /IgnoreCheck" + "`n"
}
Return $DISMcmd
}

#挂载VHD文件,导入补丁更新
Diskpart_Mount $DriveLetter $VHD_File
#判断所指定的分区是否为OS所在分区
$letter = $DriveLetter + ":\"
$Path_Win = Join-Path -Path $letter -ChildPath "Windows"
$Path_ProgramFiles = Join-Path -Path $letter -ChildPath "Program Files"
If ( (Test-Path -Path $Path_Win) -and ( Test-Path -Path $Path_ProgramFiles) )
{
$DISMcmds = Add_Updates $Updates_Folder
$DISMcmds
Invoke-Expression $DISMcmds #|Out-File $DISM_Log -Append
Diskpart_Unmount $VHD_File
}
Else
{
$ws = New-Object -ComObject WScript.Shell
$ws.popup("VHD盘符不正确,请重新指定!")
}

################################

补丁更新完成后,如果某些补丁并未提示“不适用”,显示已成功,也有可能是真的不适用该系统,无法安装成功,如下图中的KB975560和KB2425227两个补丁在更新完成后系统中并未找到,直接安装这两个补丁,提示不适用。

VHD_Update_diskpart的更多相关文章

随机推荐

  1. Java [Leetcode 337]House Robber III

    题目描述: The thief has found himself a new place for his thievery again. There is only one entrance to ...

  2. ffmpeg 从内存中读取数据(或将数据输出到内存)

    更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...

  3. Android如何调用第三方SO库

    问题描述:Android如何调用第三方SO库:已知条件:SO库为Android版本连接库(*.so文件),并提供了详细的接口说明:已了解解决方案:1.将SO文件直接放到libs/armeabi下,然后 ...

  4. Android-onTouchEvent方法的使用

    手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件.该方法的签名如下所示. public ...

  5. iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数

    iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数 iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的, ...

  6. 【转】终于解决了Apache乱码问题

    之前开放了一个空间,给网友提供电台节目音频下载.由于多年节目的文件数量甚多,且分类没有特定格式,图省事,没有制作网页提供分类下载,而是直接利用Apache的目录浏览功能,简单直观. 不过,所在的美国服 ...

  7. [Everyday Mathematics]20150107

    设 $f\in C^1[a,b]$, $f(a)=0$, 且存在 $\lm>0$, 使得 $$\bex |f'(x)|\leq \lm |f(x)|,\quad \forall\ x\in [a ...

  8. 编程式事务、XML配置事务、注解实现事务

    Spring2.0框架的事务处理有两大类: 1 编码式事务 , 这个不说. 2 声明式事务 , 就说这个. 声明式事务又有三种实现方法: 1 (第一种) 最早的方法,用TransactionProxy ...

  9. 《Python CookBook2》 第一章 文本 - 改变多行文本字符串的缩进 && 扩展和压缩制表符(此节内容待定)

    改变多行文本字符串的缩进 任务: 有个包含多行文本的字符串,需要创建该字符串的一个拷贝.并在每行行首添加或者删除一些空格,以保证每行的缩进都是指定数目的空格数. 解决方案: # -*- coding: ...

  10. 软件测试技术(六)——白盒测试之控制流覆盖准则+Visual Studio 2013单元测试

    一.目标程序 单片机发送的A/D转换结果的整体格式为:[DLE][STX]Message[CHKSUM][DLE][ETX],其中[]括号中的字符为16进制的助记符,并非ASCII码.其中:[DLE] ...