SHARE
TWEET

PatchExtract Version 1.3 by Greg Linares (@Laughing_Mantis)

Laughing_Mantis Mar 15th, 2017 (edited) 596 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <#
  2.  
  3.  ____     ______   ______  ____     __  __    
  4. /\  _`\  /\  _  \ /\__  _\/\  _`\  /\ \/\ \    
  5. \ \ \L\ \\ \ \L\ \\/_/\ \/\ \ \/\_\\ \ \_\ \  
  6.  \ \ ,__/ \ \  __ \  \ \ \ \ \ \/_/_\ \  _  \  
  7.   \ \ \/   \ \ \/\ \  \ \ \ \ \ \L\ \\ \ \ \ \
  8.    \ \_\    \ \_\ \_\  \ \_\ \ \____/ \ \_\ \_\
  9.     \/_/     \/_/\/_/   \/_/  \/___/   \/_/\/_/
  10.                                                
  11.                                                
  12.  ____     __   __   ______  ____     ______   ____     ______  
  13. /\  _`\  /\ \ /\ \ /\__  _\/\  _`\  /\  _  \ /\  _`\  /\__  _\  
  14. \ \ \L\_\\ `\`\/'/'\/_/\ \/\ \ \L\ \\ \ \L\ \\ \ \/\_\\/_/\ \/  
  15.  \ \  _\L `\/ > <     \ \ \ \ \ ,  / \ \  __ \\ \ \/_/_  \ \ \  
  16.   \ \ \L\ \  \/'/\`\   \ \ \ \ \ \\ \ \ \ \/\ \\ \ \L\ \  \ \ \
  17.    \ \____/  /\_\\ \_\  \ \_\ \ \_\ \_\\ \_\ \_\\ \____/   \ \_\
  18.     \/___/   \/_/ \/_/   \/_/  \/_/\/ / \/_/\/_/ \/___/     \/_/
  19.                                                                
  20.                                                                
  21.  __  __      _          __    
  22. /\ \/\ \   /' \       /'__`\  
  23. \ \ \ \ \ /\_, \     /\_\L\ \  
  24.  \ \ \ \ \\/_/\ \    \/_/_\_<_
  25.   \ \ \_/ \  \ \ \  __ /\ \L\ \
  26.    \ `\___/   \ \_\/\_\\ \____/
  27.     `\/__/     \/_/\/_/ \/___/
  28.  
  29.  
  30. ================
  31. PATCHEXTRACT.PS1
  32. =================
  33. Version 1.3 Microsoft MSU Patch Extraction and Patch Organization Utility by Greg Linares (@Laughing_Mantis)
  34.  
  35. This Powershell script will extract a Microsoft MSU update file and then organize the output of extracted files and folders.
  36.  
  37. Organization of the output files is based on the patch's files and will organize them based on their archicture (x86, x64, or wow64)
  38. as well as their content-type, ie: resource and catalog files will be moved to a JUNK subfolder and patch binaries and index files will
  39. goto a PATCH folder.
  40.  
  41. This script was developed in order to aid reverse engineers in quickly organizing patches so they can be binary diffed faster and easier.
  42. This was especially developed with the new bulk Microsoft Kernel patches in mind.
  43.  
  44. Example output folder structure ouput would be similar to this:
  45.  
  46. C:\PATCHES\MS15-XXX\PRE
  47.     -x86
  48.         - x86 Binary patched files
  49.     -x64
  50.         - x64 binary patched files
  51.     -WOW64
  52.         - syswow64 binary patched files
  53.     -JUNK
  54.         - resource, catalog, mum, and other non-binary based patched files
  55.     -PATCH
  56.         - original patch, cabs and xml files from the extraction
  57.     -MSIL
  58.         - MSIL .NET binary patched files ***New in Version 1.1***
  59.  
  60.     Directories will automagically be organized into filename-version to remove garbage filler folder names
  61.        
  62.        
  63. =============
  64. REQUIREMENTS
  65. =============
  66. 'expand.exe' to be present in %WINDIR%\SYSTEM32 (it is by default) - It will execute this file @ the current users permissions
  67. A valid Microsoft MSU patch file to extract (PATCH variable)
  68. Directory and File write/creation permissions to the PATH folder specified
  69.        
  70.    
  71. =======    
  72. USAGE
  73. =======
  74.  
  75. Powershell -ExecutionPolicy Bypass -File PatchExtract.ps1 -Patch C:\Patches\Windows6.1-KB3088195-x64.msu -Path C:\Patches\MS15-XXX\POST\
  76.  
  77.  
  78. This would extract the patch file C:\Patches\Windows6.1-KB3088195-x64.msu to the folder C:\Patches\MS15-XXX\POST\.
  79. It will then create all the sub organization folders within C:\Patches\MS15-XXX\POST\ folder.
  80.  
  81. (Note: the optional Powershell parameters '-ExecutionPolicy Bypass' is necessary in some environments to overcome Powershell execution restrictions)
  82.  
  83. ==========
  84. ARGUMENTS
  85. ==========
  86. -PATCH <STRING:Filename> [REQUIRED] [NO DEFAULT]
  87.     Specifies the MSU file that will be extracted to the specified PATH folder and then organized into the x86, x64, WOW, JUNK, and BIN folders specified
  88.     Extract command will be "expand -F:* <PATCH> <PATH>"
  89.     Non MSU files have not been tested however if the extraction does not generate a CAB file of the same name (indicator of successful extraction of MSU files)
  90.     the script assumes extraction failed.
  91.    
  92. -PATH <STRING:FolderPath> [REQUIRED] [NO DEFAULT]
  93.     Specified the folder that the PATCH file will be extracted and organized into
  94.     If the specified folders does not exist yet, the user will be prompted if they want to create it.
  95.     Relative paths '.\POST' can be used but it has not extensively been tested.
  96.  
  97.     ***New in Version 1.1***
  98.     The -PATH variable may be now omitted to expand to current directory
  99.    
  100.  
  101. -x86 <STRING:Foldername> [OPTIONAL] [DEFAULT='x86']
  102.  
  103.     Specifies the folder name within $PATH to store x86 patch binaries
  104.     example: -x86 32bit
  105.    
  106.    
  107. -x64 <STRING:Foldername> [OPTIONAL] [DEFAULT='x64']
  108.  
  109.     Specifies the folder name within $PATH to store x64 patch binaries
  110.     example: -x64 64bit
  111.    
  112. -WOW <STRING:Foldername> [OPTIONAL] [DEFAULT='WOW64']
  113.  
  114.     Specifies the folder name within $PATH to store wow64 type patch binaries
  115.     example: -WOW sysWOW64
  116.  
  117. -MSIL <STRING:Foldername> [OPTIONAL] [DEFAULT='MSIL']
  118.  
  119.     *** New in Version 1.1***
  120.     Specifies the folder name within $PATH to store .NET type patch binaries
  121.     example: -MSIL DOTNET
  122.    
  123. -JUNK <STRING:Foldername> [OPTIONAL] [DEFAULT='JUNK']
  124.  
  125.     Specifies the folder name within $PATH to store resource, catalog, and other generally useless for diffing patch binaries
  126.     example: -JUNK res
  127.    
  128.    
  129. -BIN <STRING:Foldername> [OPTIONAL] [DEFAULT='PATCH']
  130.  
  131.     Specifies the folder name within $PATH to store extraction xml and original patch msu and cab files
  132.     example: -BIN bin
  133.  
  134.  
  135. ================
  136. VERSION HISTORY
  137. ================
  138. I originally wrote this as an ugly batch file sometime between 2014 and 2015 as a way to organize folders but it was incomplete and buggy
  139.  
  140. Oct 15, 2015 - Initial Public Release 1.0
  141. Oct 20, 2016 - Version 1.1 Released
  142.                 * Bug fixes handling new naming format for patch .cab files
  143.                 * Added the ability to auto-extract to the same directory as current PATCH
  144.                 * filtered output directory name format to aid in bindiffing
  145.  
  146. Oct 20, 2016 - Version 1.2 Released
  147.                 * Bug fixes handling MSIL renaming issues and collisions in renameing patch folders
  148.  
  149. Nov 7, 2016 - Version 1.25 Released
  150.                 * Added hack to handle subsequent CAB files Microsoft Added in Windows 10 Cumulative Patches - will make a better way to handle this in 1.3
  151.  
  152. March 15, 2017 - Version 1.3 Released
  153.                 * Color Change to sweet vaporwave retro 80s colors
  154.                 * Cleaned up some awful code that I must have been on some amazing substances when I wrote
  155.                 * Spent several hours making a rad ASCII Logo
  156.                 * Most importantly fixed the Sub-cab auto-extraction method that Microsoft introduced late 2016
  157.  
  158.  
  159.  
  160. ==========
  161. LICENSING
  162. ==========
  163. This script is provided free as beer.  It probably has some bugs and coding issues, however if you like it or find it useful please give me a shout out on twitter @Laughing_Mantis.  
  164. Feedback is encouraged and I will be likely releasing new scripts and tools and training in the future if it is welcome.
  165.  
  166.  
  167. -GLin
  168.  
  169. #>
  170.  
  171.  
  172.  
  173.  
  174. Param
  175. (
  176.  
  177.     [Parameter(ValueFromPipelineByPropertyName = $true)]
  178.     [ValidateNotNullOrEmpty()]
  179.     [string]$PATCH = "",
  180.    
  181.     [Parameter(ValueFromPipelineByPropertyName = $true)]
  182.     [string]$PATH = "",
  183.    
  184.     [Parameter(ValueFromPipelineByPropertyName = $true)]
  185.     [string]$x86 = "x86",
  186.    
  187.     [Parameter(ValueFromPipelineByPropertyName = $true)]
  188.     [string]$x64 = "x64",
  189.    
  190.     [Parameter(ValueFromPipelineByPropertyName = $true)]
  191.     [string]$WOW = "WOW64",
  192.  
  193.     [Parameter(ValueFromPipelineByPropertyName = $true)]
  194.     [string]$MSIL = "MSIL",
  195.    
  196.     [Parameter(ValueFromPipelineByPropertyName = $true)]
  197.     [string]$JUNK = "JUNK",
  198.    
  199.     [Parameter(ValueFromPipelineByPropertyName = $true)]
  200.     [string]$BIN = "PATCH"
  201.        
  202. )
  203.  
  204. Clear-Host
  205. $ASCIIART = @"
  206. ____     ______   ______  ____     __  __    
  207. /\  _`\  /\  _  \ /\__  _\/\  _`\  /\ \/\ \  
  208. \ \ \L\ \\ \ \L\ \\/_/\ \/\ \ \/\_\\ \ \_\ \  
  209. \ \ ,__/ \ \  __ \  \ \ \ \ \ \/_/_\ \  _  \  
  210.  \ \ \/   \ \ \/\ \  \ \ \ \ \ \L\ \\ \ \ \ \
  211.   \ \_\    \ \_\ \_\  \ \_\ \ \____/ \ \_\ \_\
  212.    \/_/     \/_/\/_/   \/_/  \/___/   \/_/\/_/
  213.                                              
  214.                                              
  215. ____     __   __   ______  ____     ______   ____     ______  
  216. /\  _`\  /\ \ /\ \ /\__  _\/\  _`\  /\  _  \ /\  _`\  /\__  _\  
  217. \ \ \L\_\\ `\`\/'/'\/_/\ \/\ \ \L\ \\ \ \L\ \\ \ \/\_\\/_/\ \/  
  218. \ \  _\L `\/ > <     \ \ \ \ \ ,  / \ \  __ \\ \ \/_/_  \ \ \  
  219.  \ \ \L\ \  \/'/\`\   \ \ \ \ \ \\ \ \ \ \/\ \\ \ \L\ \  \ \ \
  220.   \ \____/  /\_\\ \_\  \ \_\ \ \_\ \_\\ \_\ \_\\ \____/   \ \_\
  221.    \/___/   \/_/ \/_/   \/_/  \/_/\/ / \/_/\/_/ \/___/     \/_/
  222.                                                                
  223.                                                                
  224. __  __      _          __    
  225. /\ \/\ \   /' \       /'__`\  
  226. \ \ \ \ \ /\_, \     /\_\L\ \  
  227. \ \ \ \ \\/_/\ \    \/_/_\_<_
  228.  \ \ \_/ \  \ \ \  __ /\ \L\ \
  229.   \ `\___/   \ \_\/\_\\ \____/
  230.    `\/__/     \/_/\/_/ \/___/
  231. "@
  232.  
  233. Write-Host $ASCIIART -ForegroundColor Magenta
  234. Start-Sleep -s 3
  235.  
  236.  
  237. if ($PATCH -eq "")
  238. {
  239.     Throw ("Error: No PATCH file specified.  Specify a valid Microsoft MSU Patch with the -PATCH argument")
  240.    
  241. }
  242.  
  243. if ((Split-Path $PATCH -Parent) -eq "")
  244. {
  245.     # First look in current working directory for the relative filename
  246.     $CurrentDir = $(get-location).Path;
  247.     $PATCH = $CurrentDir + "\" + $PATCH
  248.  
  249.     # if that doesnt work we look in the current script directory (less likely)
  250.     # but hey we tried
  251.     if (!(Test-Path $PATCH))
  252.     {
  253.         $scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
  254.         $PATCH = $scriptDir + "\" + $PATCH
  255.     }
  256. }
  257.  
  258. if (!(Test-Path $PATCH))
  259. {
  260.     Throw ("Error: Specified PATCH file ($PATCH) does not exist.  Specify a valid Microsoft MSU Patch file with the -PATCH argument.")
  261. }
  262.  
  263. if ($PATH -eq "")
  264. {
  265.     $PATH = Split-Path $PATCH -Parent
  266.     write-Host ("PATH = $PATH") -ForegroundColor White
  267.     Write-Host ("No PATH folder specified.  Will extract to $PATH folder.") -ForegroundColor White
  268.    
  269. }
  270.  
  271. #Bug Fix (Resolve-Path Error if invalid path was specified before the path was created)
  272.  
  273.  
  274.  
  275.  
  276. if (!($PATCH.ToUpper().EndsWith(".MSU")))
  277. {
  278.     Do
  279.     {
  280.         $Attempt = Read-Host ("Warning: Specified PATCH file ($PATCH) is not a MSU file type. Do you still want to attempt extraction? [Y] or [N]")
  281.     }
  282.     Until ('Y', 'y', 'n', 'N' -ccontains $Attempt)
  283.     if ($Attempt.ToUpper() -eq 'N')
  284.     {
  285.         Write-Host ("Exiting...") -ForegroundColor DarkMagenta
  286.         Exit
  287.     }
  288. }
  289.  
  290. if (!(Test-Path $PATH))
  291. {
  292.     Do
  293.     {
  294.         $Attempt = Read-Host ("Warning: Specified PATH folder ($PATH) does not exist. Do you want to create it? [Y] or [N]")
  295.     }
  296.     Until ('Y', 'y', 'n', 'N' -ccontains $Attempt)
  297.     if ($Attempt.ToUpper() -eq 'N')
  298.     {
  299.         Write-Host ("Exiting...") -ForegroundColor DarkMagenta
  300.         Exit
  301.     }
  302.     else
  303.     {
  304.         New-Item $PATH -Force -ItemType Directory
  305.         Write-Host "Created $PATH Folder" -ForegroundColor Cyan
  306.     }
  307. }
  308.  
  309. $PATCH = Resolve-Path $PATCH
  310. $PATH = Resolve-Path $PATH
  311.  
  312. Write-Host "Patch to Extract: $PATCH" -ForegroundColor Magenta
  313. Write-Host "Extraction Path: $PATH" -ForegroundColor Magenta
  314. Write-Host "x86 File Storage Folder Name: $x86" -ForegroundColor Magenta
  315. Write-Host "x64 File Storage Folder Name: $x64" -ForegroundColor Magenta
  316. Write-Host "WOW64 File Storage Folder Name: $WOW" -ForegroundColor Magenta
  317. Write-Host "MSIL File Storage Folder Name: $MSIL" -ForegroundColor Magenta
  318. Write-Host "Junk File Storage Folder Name: $JUNK" -ForegroundColor Magenta
  319. Write-Host "Orignal Patch File Storage Folder Name: $BIN" -ForegroundColor Magenta
  320.  
  321.  
  322.  
  323. $PATCHx86 = Join-Path -path $PATH -ChildPath $x86
  324. $PATCHx64 = Join-Path -path $PATH -ChildPath $x64
  325. $PATCHWOW = Join-Path -path $PATH -ChildPath $WOW
  326. $PATCHMSIL = Join-Path -path $PATH -ChildPath $MSIL
  327. $PATCHJUNK = Join-Path -path $PATH -ChildPath $JUNK
  328. $PATCHCAB = Join-Path -path $PATH -ChildPath $BIN
  329.  
  330.  
  331. if (!(Test-Path $PATCHx86 -pathType Container))
  332. {
  333.     New-Item $PATCHx86 -Force -ItemType Directory
  334.     Write-Host "Making $PATCHx86 Folder" -ForegroundColor Cyan
  335. }
  336.  
  337. if (!(Test-Path $PATCHx64 -pathType Container))
  338. {
  339.     New-Item $PATCHx64 -Force -ItemType Directory
  340.     Write-Host "Making $PATCHx64 Folder" -ForegroundColor Cyan
  341. }
  342.  
  343. if (!(Test-Path $PATCHWOW -pathType Container))
  344. {
  345.     New-Item $PATCHWOW -Force -ItemType Directory
  346.     Write-Host "Making $PATCHWOW Folder" -ForegroundColor Cyan
  347. }
  348.  
  349. if (!(Test-Path $PATCHMSIL -pathType Container))
  350. {
  351.     New-Item $PATCHMSIL -Force -ItemType Directory
  352.     Write-Host "Making $PATCHMSIL Folder" -ForegroundColor Cyan
  353. }
  354.  
  355. if (!(Test-Path $PATCHJUNK -pathType Container))
  356. {
  357.     New-Item $PATCHJUNK -Force -ItemType Directory
  358.     Write-Host "Making $PATCHJUNK Folder" -ForegroundColor Cyan
  359. }
  360.  
  361. if (!(Test-Path $PATCHCAB -pathType Container))
  362. {
  363.     New-Item $PATCHCAB -Force -ItemType Directory
  364.     Write-Host "Making $PATCHCAB Folder" -ForegroundColor Cyan
  365. }
  366.  
  367.  
  368. $SYSPATH = Join-Path -path (get-item env:\windir).Value -ChildPath "system32"
  369.  
  370. $EXPAND = Join-Path -path $SYSPATH -ChildPath "expand.exe"
  371.  
  372.  
  373. if (!(Test-Path $EXPAND))
  374. {
  375.     Throw ("Error: Cannot find 'Expand.exe' in the $SYSPATH folder.")
  376. }
  377.  
  378. $ARG = '-F:* ' + '"' + $PATCH + '" ' + '"' + $PATH + '"'
  379.  
  380. Write-Host "Executing the following command: $EXPAND $ARG" -ForegroundColor Cyan
  381.  
  382. Start-Process -File $EXPAND -ArgumentList $ARG -Wait
  383.  
  384.  
  385.  
  386. $CABS = Get-Childitem -Path $PATH -Filter *.cab
  387. foreach ($CAB in $CABS)
  388. {
  389.     Write-Host "CAB File: $CAB" -ForegroundColor White
  390.     if (!($CAB.Name -eq "WSUSSCAN.cab"))
  391.     {
  392.         $CAB = Join-Path -path $PATH -ChildPath $CAB
  393.         Write-Host "Main-Cab: $CAB" -ForegroundColor Magenta
  394.         if (Test-Path $CAB)
  395.         {
  396.             $ARG = '-F:* ' + '"' + $CAB + '" ' + '"' + $PATH + '"'
  397.             Write-Host "Executing the following command: $EXPAND $ARG" -ForegroundColor Cyan
  398.             Start-Process -File $EXPAND -ArgumentList $ARG -Wait
  399.             Write-Host "Moving $CAB to $PATCHCAB" -ForegroundColor Magenta
  400.             Move-Item $CAB $PATCHCAB -Force -ErrorAction SilentlyContinue
  401.         }
  402.         else
  403.         {
  404.             Throw "Error: Patch .CAB File [$CAB] could not be located.  Patch Extraction failed - please send notification of this error to @Laughing_Mantis."
  405.         }
  406.     }
  407.     else
  408.     {
  409.         Write-Host "Moving $CAB to $PATCHCAB" -ForegroundColor Magenta
  410.         Move-Item $CAB $PATCHCAB -Force -ErrorAction SilentlyContinue
  411.     }
  412. }
  413.  
  414. #Now for subcabs we do it again
  415. $CABS = Get-Childitem -Path $PATH -Filter *.cab
  416. foreach ($CAB in $CABS)
  417. {
  418.     if (!($CAB.Name -eq "WSUSSCAN.cab"))
  419.     {
  420.         $CAB =  Join-Path -path $PATH -ChildPath $CAB
  421.         Write-Host "Sub-Cab: $CAB" -ForegroundColor Magenta
  422.         if (Test-Path $CAB)
  423.         {
  424.             $ARG = '-F:* ' + '"' + $CAB + '" ' + '"' + $PATH + '"'
  425.             Write-Host "Executing the following command: $EXPAND $ARG" -ForegroundColor Cyan
  426.             Start-Process -File $EXPAND -ArgumentList $ARG -Wait
  427.             Write-Host "Moving $CAB to $PATCHCAB" -ForegroundColor Magenta
  428.             Move-Item $CAB $PATCHCAB -Force -ErrorAction SilentlyContinue
  429.         }
  430.         else
  431.         {
  432.             Throw "Error: Patch .CAB File [$CAB] could not be located.  Patch Extraction failed - please send notification of this error to @Laughing_Mantis."
  433.         }
  434.     }
  435. }
  436.  
  437.  
  438. <# Microsoft newer patches do not follow this formula - likely an attempt to prevent
  439. auto extraction so we need to handle scenarios where patch cab does not have the same
  440. name as the container MSP #>
  441.  
  442.  
  443.  
  444.  
  445.  
  446. <# Nov 7th, 2016 - Looks like Microsoft does not like my tool and added new sub-CABs to make automagic patch extraction not work.
  447. Adding an additional check to look for sub-CABs incase this becomes the new normal.
  448. This is an absolute hack that will likely be bypassed next month.
  449. #>
  450.  
  451.  
  452.  
  453. <# 1.3 Fix - Microsoft likes to put multiple .Cabs in a single MSU now....
  454.     So we will look in the extracted contents and run extract on ALL cabs found
  455.     except for WSUSSCAN.cab - I feel like Microsoft might put specific patches in
  456.     sub cabs that might cause extracted files to overwrite each other - ie
  457.     cab 1 might have binaries for specific build while cab 2 has same binary/folder name for
  458.     different build...fingers crossed this doesnt happen
  459.     Also Greetz to all the Microsoft Patch Team members
  460. #>
  461.  
  462. ### I must have been on some amazing substances when i wrote this next part.....utterly ridiculous
  463. ### yeah this is garbage let me rewrite this for 1.3
  464.  
  465. <# GARBAGE CODE BELOW SAVED FOR SHAMING PURPOSES
  466. $patchCABID = "cab_" + $patchCAB + "_*.cab"
  467. $CAB = (Get-ChildItem -Path $PATH -Filter $PatchCABID | Select-Object -First 1)
  468. Write-Host "Debug CAB = $CAB"
  469. if (Test-Path $CAB)
  470. {
  471.     $flag = "1"
  472. }
  473.  
  474. while ($flag -eq "1")
  475. {
  476.     Write-Host "Subsequent CAB  $CAB detected - attempting beta extraction" -ForegroundColor Yellow
  477.     $ARG = '-F:* ' + '"' + $CAB + '" ' + '"' + $PATH + '"'
  478.  
  479.     Write-Host "Executing the following command: $EXPAND $ARG" -ForegroundColor Cyan
  480.  
  481.     Start-Process -File $EXPAND -ArgumentList $ARG -Wait
  482.  
  483.     $patchCAB++
  484.  
  485.     $patchCABID = "cab_" + $patchCAB + "_*.cab"
  486.     try
  487.     {
  488.         $CAB = (Get-ChildItem -Path $PATH -Filter $PatchCABID | Select-Object -First 1)
  489.         if ((!(Test-Path $CAB)) -or ($CAB -eq ""))
  490.         {
  491.             $flag = "0"
  492.         }
  493.     }
  494.     catch
  495.     {
  496.         $flag = "0"
  497.     }
  498.  
  499. }
  500. #>
  501.  
  502.  
  503.  
  504. $PATCHFolders = Get-ChildItem -Path $PATH -Force -ErrorAction SilentlyContinue | where {$_.Attributes -eq 'Directory'}
  505.  
  506. foreach ($folder in $PATCHFolders)
  507. {
  508.     if ($folder.Name.Contains(".resources_"))
  509.     {
  510.         Move-Item $folder.FullName $PATCHJUNK -Force
  511.         Write-Host "Moving $folder to $PATCHJUNK" -ForegroundColor Cyan
  512.         Continue
  513.     }
  514.     else
  515.     {
  516.         if ($folder.Name.StartsWith("x86_"))
  517.         {
  518.             Move-Item $folder.FullName $PATCHx86 -Force
  519.             Write-Host "Moving $folder to $PATCHx86" -ForegroundColor Cyan
  520.             Continue
  521.         }
  522.        
  523.         if ($folder.Name.StartsWith("amd64_"))
  524.         {
  525.             Move-Item $folder.FullName $PATCHx64 -Force
  526.             Write-Host "Moving $folder to $PATCHx64" -ForegroundColor Cyan
  527.             Continue
  528.         }
  529.        
  530.         if ($folder.Name.StartsWith("wow64_"))
  531.         {
  532.             Move-Item $folder.FullName $PATCHWOW -Force
  533.             Write-Host "Moving $folder to $PATCHWOW" -ForegroundColor Cyan
  534.             Continue
  535.         }
  536.  
  537.         if ($folder.Name.StartsWith("msil_"))
  538.         {
  539.             Move-Item $folder.FullName $PATCHMSIL -Force
  540.             Write-Host "Moving $folder to $PATCHMSIL" -ForegroundColor Cyan
  541.             Continue
  542.         }
  543.     }
  544. }
  545.  
  546. <# PRETTY BINDIFF OUTPUT - changes folder names from x86-microsoft-windows-filename-hash-version-garbage to filename-version #>
  547.  
  548. $PATCHFolders = Get-ChildItem -Path $PATCHx86 -Force -ErrorAction SilentlyContinue | where {$_.Attributes -eq 'Directory'}
  549.  
  550. foreach ($folder in $PATCHFolders)
  551. {
  552.     if ($folder -like "x86_microsoft-windows-*")
  553.     {
  554.         $newfolder = $folder.Name.Replace("x86_microsoft-windows-", "")
  555.         $newname = $newfolder.Split("_")[0]
  556.         $version = $newfolder.Split("_")[2]
  557.         $newname = $newname + "_" + $version
  558.         Write-Host ("Renaming $folder to $newname") -ForegroundColor Magenta
  559.         Rename-Item -path $folder.FullName -newName ($newname)
  560.     }
  561.     elseif ($folder -like "x86_*")
  562.     {
  563.         $newfolder = $folder.Name.Replace("x86_", "")
  564.         $newname = $newfolder.Split("_")[0]
  565.         $version = $newfolder.Split("_")[2]
  566.         $newname = $newname + "_" + $version
  567.         Write-Host ("Renaming $folder to $newname") -ForegroundColor Cyan
  568.         Rename-Item -path $folder.FullName -newName ($newname)
  569.     }
  570. }
  571.  
  572. $PATCHFolders = Get-ChildItem -Path $PATCHx64 -Force -ErrorAction SilentlyContinue | where {$_.Attributes -eq 'Directory'}
  573.  
  574. foreach ($folder in $PATCHFolders)
  575. {
  576.     if ($folder -like "amd64_microsoft-windows-*")
  577.     {
  578.         $newfolder = $folder.Name.Replace("amd64_microsoft-windows-", "")
  579.         $newname = $newfolder.Split("_")[0]
  580.         $version = $newfolder.Split("_")[2]
  581.         $newname = $newname + "_" + $version
  582.         Write-Host ("Renaming $folder to $newname") -ForegroundColor Magenta
  583.         Rename-Item -path $folder.FullName -newName ($newname)
  584.     }
  585.     elseif ($folder -like "amd64_*")
  586.     {
  587.         $newfolder = $folder.Name.Replace("amd64_", "")
  588.         $newname = $newfolder.Split("_")[0]
  589.         $version = $newfolder.Split("_")[2]
  590.         $newname = $newname + "_" + $version
  591.         Write-Host ("Renaming $folder to $newname") -ForegroundColor Cyan
  592.         Rename-Item -path $folder.FullName -newName ($newname)
  593.     }
  594. }
  595.  
  596. $PATCHFolders = Get-ChildItem -Path $PATCHWOW -Force -ErrorAction SilentlyContinue | where {$_.Attributes -eq 'Directory'}
  597.  
  598. foreach ($folder in $PATCHFolders)
  599. {
  600.     if ($folder -like "wow64_microsoft-windows-*")
  601.     {
  602.         $newfolder = $folder.Name.Replace("wow64_microsoft-windows-", "")
  603.         $newname = $newfolder.Split("_")[0]
  604.         $version = $newfolder.Split("_")[2]
  605.         $newname = $newname + "_" + $version
  606.         Write-Host ("Renaming $folder to $newname") -ForegroundColor Magenta
  607.         Rename-Item -path $folder.FullName -newName ($newname)
  608.     }
  609.     elseif ($folder -like "wow64_*")
  610.     {
  611.         $newfolder = $folder.Name.Replace("wow64_", "")
  612.         $newname = $newfolder.Split("_")[0]
  613.         $version = $newfolder.Split("_")[2]
  614.         $newname = $newname + "_" + $version
  615.         Write-Host ("Renaming $folder to $newname") -ForegroundColor Cyan
  616.         Rename-Item -path $folder.FullName -newName ($newname)
  617.     }
  618. }
  619.  
  620. $PATCHFolders = Get-ChildItem -Path $PATCHMSIL -Force -ErrorAction SilentlyContinue | where {$_.Attributes -eq 'Directory'}
  621.  
  622. foreach ($folder in $PATCHFolders)
  623. {
  624.     if ($folder -like "msil_*")
  625.     {
  626.         $newfolder = $folder.Name.Replace("msil_", "")
  627.         $newname = $newfolder.Split("_")[0]
  628.         $version = $newfolder.Split("_")[2]
  629.         $newname = $newname + "_" + $version
  630.         Write-Host ("Renaming $folder to $newname") -ForegroundColor Cyan
  631.         Rename-Item -path $folder.FullName -newName ($newname)
  632.     }
  633.  
  634. }
  635.  
  636. $Junkfiles = Get-ChildItem -Path $PATH -Force -ErrorAction SilentlyContinue
  637.  
  638.  
  639. foreach ($JunkFile in $Junkfiles)
  640. {
  641.    
  642.     try
  643.     {
  644.         if (($JunkFile.Name.EndsWith(".manifest")) -or ($JunkFile.Name.EndsWith(".cat")) -or ($JunkFile.Name.EndsWith(".mum")))
  645.         {
  646.             Move-Item $JunkFile.FullName $PATCHJUNK -Force -ErrorAction SilentlyContinue
  647.             Write-Host "Moving $JunkFile to $PATCHJUNK" -ForegroundColor Magenta
  648.             Continue
  649.         }
  650.        
  651.         if (($JunkFile.Name.EndsWith(".cab")) -or ($JunkFile.Name.EndsWith(".xml")) -or ($JunkFile.Name.EndsWith(".msu")) -or ($JunkFile.Name.EndsWith("pkgProperties.txt")))
  652.         {
  653.             Move-Item $JunkFile.FullName $PATCHCAB -Force -ErrorAction SilentlyContinue
  654.             Write-Host "Moving $JunkFile to $PATCHCAB" -ForegroundColor Cyan
  655.             Continue
  656.         }
  657.         if ($JunkFile.Name -eq "patch")
  658.         {
  659.             Move-Item $JunkFile.FullName $PATCHCAB -Force -ErrorAction SilentlyContinue
  660.             Write-Host "Moving $JunkFile to $PATCHCAB" -ForegroundColor Magenta
  661.             Continue
  662.         }
  663.     }
  664.     catch
  665.     {
  666.         Write-Host "Error Processing ($JunkFile.Fullname)" -ForegroundColor DarkMagenta
  667.     }
  668. }
RAW Paste Data
Pastebin PRO Autumn Special!
Get 40% OFF on Pastebin PRO accounts!
Top