*! Update: 2014-09-30:
Looking for the latest version of ADK 8.1, see my most recent post
Follow-up on downloading Windows Assessment and Deployment Kit (Windows ADK) 8.1 (September 2014)
I proposed last year two scripts to download the latest Windows Assessment and Deployment Kit (ADK) files using BITS and PowerShell š
- https://p0w3rsh3ll.wordpress.com/2013/10/24/download-windows-assessment-and-deployment-kit-windows-adk-8-1/
- https://p0w3rsh3ll.wordpress.com/2013/02/20/download-windows-assessment-and-deployment-kit-windows-adk-with-bits-cmdlets/
Today is April 8, 2014 and it’s the perfect time to update the script.
But let’s first see how I built the DATA blocks in the function.
I first launched the webinstaller of the ADK and told him to download files into C:\ADK.
Then I used PowerShell to extract the DATA using the following code.
# First test the regular expression with the built-in select-string cmdlet Get-Content 'C:\adk\Windows Assessment and Deployment Kit for Windows 8.1_20140403114657.log' | Select-String -Pattern "Acquiring\spackage:\s(?<Name1>.*),\spayload:\s(?<Name2>.*),\sdownload\sfrom:\s(?<URL>.*)$" # Extract URL and file names from the log file and send it through the pipeline $ADKFiles = ( Get-Content "C:\adk\Windows Assessment and Deployment Kit for Windows 8.1_20140403114657.log" -ReadCount 1 | ForEach-Object { ([regex]'Acquiring\spackage:\s(?<Name1>.*),\spayload:\s(?<Name2>.*),\sdownload\sfrom:\s(?<URL>.*)$').Matches($_) | ForEach-Object { [PSCustomObject]@{ URL = @($_.Groups)[-1].Value ; FileName = ([URI]@($_.Groups)[-1].Value).Segments[-1] -replace '%20'," " } } } ) # Let me know how many files are downloaded Write-Verbose -Message ("There are {0} files in the ADK toolkit to download" -f $Adkfiles.Count) -Verbose Write-Verbose -Message ( "There are {0} files in the ADK toolkit from ../adk/Installers" -f ($Adkfiles| Where URL -match "adk/Installers/").Count ) -Verbose Write-Verbose -Message ( "There are {0} files in the ADK toolkit from ../adk/Patches" -f ($Adkfiles| Where URL -notmatch "adk/Installers/").Count ) -Verbose # Construct the first DATA block $count = 0 ($Adkfiles| Where URL -match "adk/Installers/") | ForEach-Object { '{0}={1}' -f $count,$_.FileName $count++ } # Construct the second DATA block $count = 0 ($Adkfiles| Where URL -notmatch "adk/Installers/") | ForEach-Object { '{0}={1}' -f $count,$_.FileName $count++ }
Then I copied the console output you can see above into the appropriate DATA blocks and updated manually the version string from 8.100.26020 to 8.100.26629
#Requires -Version 4 #Requires -RunAsAdministrator Function Get-ADKFiles { [CmdletBinding()] param( [parameter(Mandatory)] [system.string]$TargetFolder ) Begin { $HT = @{} $HT += @{ ErrorAction = 'Stop'} # Validate target folder try { Get-Item $TargetFolder @HT | Out-Null } catch { Write-Warning -Message "The target folder specified as parameter does not exist" break } } Process { $adkGenericURL = (Invoke-WebRequest -Uri http://go.microsoft.com/fwlink/?LinkID=313081 -MaximumRedirection 0 -ErrorAction SilentlyContinue) # 302 = redirect as moved temporarily if ($adkGenericURL.StatusCode -eq 302) { # Currently set to http://download.microsoft.com/download/6/A/E/6AEA92B0-A412-4622-983E-5B305D2EBE56/adk/ $MainURL = $adkGenericURL.Headers.Location $InstallerURLs = DATA { ConvertFrom-StringData @' 0=Toolkit Documentation-x86_en-us.msi 1=e5f4f4dc519b35948be4500a7dfeab14.cab 2=56e5d88e2c299be31ce4fc4a604cede4.cab 3=4fc82a5cedaab58e43b487c17f6ef6f3.cab 4=d562ae79e25b943d03fc6aa7a65f9b81.cab 5=dotNetFx45_Full_x86_x64.exe 6=Application Compatibility Toolkit-x86_en-us.msi 7=3d610ba2a5a333717eea5f9db277718c.cab 8=0a3a39d2f8a258e1dea4e76da0ec31b8.cab 9=f7699e5a82dcf6476e5ed2d8a3507ace.cab 10=e65f08c56c86f4e6d7e9358fa99c4c97.cab 11=Microsoft Compatibility Monitor-x86_en-us.msi 12=Application Compatibility Toolkit-x64_en-us.msi 13=83bd1072721871ea0bdc4fab780d9382.cab 14=Microsoft Compatibility Monitor-x86_en-us.msi 15=Windows Deployment Tools-x86_en-us.msi 16=3b71855dfae6a44ab353293c119908b8.cab 17=a011a13d3157dae2dbdaa7090daa6acb.cab 18=b6758178d78e2a03e1d692660ec642bd.cab 19=4defb086385752d8cd0d1432900fb4ca.cab 20=630e2d20d5f2abcc3403b1d7783db037.cab 21=a7eb3390a15bcd2c80a978c75f2dcc4f.cab 22=56dd07dea070851064af5d29cadfac56.cab 23=870d7f92116bc55f7f72e7a9f5d5d6e1.cab 24=c98a0a5b63e591b7568b5f66d64dc335.cab 25=eacac0698d5fa03569c86b25f90113b5.cab 26=f2a850bce4500b85f37a8aaa71cbb674.cab 27=8624feeaa6661d6216b5f27da0e30f65.cab 28=388dee738d7d1c99d6fe776a85ee32f8.cab 29=413a073d16688e177d7536cd2a64eb43.cab 30=500e0afd7cc09e1e1d6daca01bc67430.cab 31=9050f238beb90c3f2db4a387654fec4b.cab 32=5d984200acbde182fd99cbfbe9bad133.cab 33=abbeaf25720d61b6b6339ada72bdd038.cab 34=1439dbcbd472f531c37a149237b300fc.cab 35=2517aec0259281507bfb693d7d136f30.cab 36=d2611745022d67cf9a7703eb131ca487.cab 37=f480ed0b7d2f1676b4c1d5fc82dd7420.cab 38=0c48c56ca00155f992c30167beb8f23d.cab 39=662ea66cc7061f8b841891eae8e3a67c.cab 40=36e3c2de16bbebad20daec133c22acb1.cab 41=fcc051e0d61320c78cac9fe4ad56a2a2.cab 42=69f8595b00cf4081c2ecc89420610cbd.cab 43=ea9c0c38594fd7df374ddfc620f4a1fd.cab 44=bbf55224a0290f00676ddc410f004498.cab 45=Windows System Image Manager on amd64-x86_en-us.msi 46=Windows System Image Manager on x86-x86_en-us.msi 47=Windows Deployment Customizations-x86_en-us.msi 48=93ed81ef8cf2e77c6ebc8aba5d95b9cf.cab 49=377a2b6b26ea305c924c25cf942400d6.cab 50=4e56c6c11e546d4265da4e9ff7686b67.cab 51=WimMountAdkSetupX86.exe 52=WimMountAdkSetupAmd64.exe 53=WimMountAdkSetupArm.exe 54=InstallRegHiveRecoveryDriverX86.exe 55=InstallRegHiveRecoveryDriverAmd64.exe 56=Windows PE x86 x64-x86_en-us.msi 57=a32918368eba6a062aaaaf73e3618131.cab 58=a32918368eba6a062aaaaf73e3618131.cab 59=a32918368eba6a062aaaaf73e3618131.cab 60=a32918368eba6a062aaaaf73e3618131.cab 61=0b63b7c537782729483bff2d64a620fa.cab 62=9722214af0ab8aa9dffb6cfdafd937b7.cab 63=aa25d18a5fcce134b0b89fb003ec99ff.cab 64=Windows PE x86 x64 wims-x86_en-us.msi 65=690b8ac88bc08254d351654d56805aea.cab 66=6d3c63e785ac9ac618ae3f1416062098.cab 67=User State Migration Tool-x86_en-us.msi 68=5ac1863798809c64e85c2535a27a3da6.cab 69=4d2878f43060bacefdd6379f2dae89b0.cab 70=Volume Activation Management Tool-x86_en-us.msi 71=fe43ba83b8d1e88cc4f4bfeac0850c6c.cab 72=WPTx86-x86_en-us.msi 73=WPTx64-x86_en-us.msi 74=WPT Redistributables-x86_en-us.msi 75=WPTx86-x86_en-us.msi 76=WPTx64-x86_en-us.msi 77=WPTarm-arm_en-us.msi 78=Windows Assessment Toolkit-x86_en-us.msi 79=23ca402f61cda3f672b3081da79dab63.cab 80=0ce2876e9da7f82aac8755701aecfa64.cab 81=24b9e5f1f97c2f05aa95ee1f671fd3cc.cab 82=Windows Assessment Toolkit (AMD64 Architecture Specific)-x86_en-us.msi 83=Windows Assessment Toolkit (X86 Architecture Specific)-x86_en-us.msi 84=Assessments on Client-x86_en-us.msi 85=4d15138ec839ce36f5b68c16b332920a.cab 86=cd23bfdfd9e3dfa8475bf59c2c5d6901.cab 87=86ae476dfe0498a5b5d1b6f3076412c7.cab 88=6da2af86cb1227e66cf9bc85f2786782.cab 89=a565f18707816c0d052281154b768ac0.cab 90=b0189bdfbad208b3ac765f88f21a89df.cab 91=be7ebc1ac434ead4ab1cf36e3921b70e.cab 92=781e7c95c1b6b277057c9b53b7b5a044.cab 93=036c618de505eeb40cca35afad6264f5.cab 94=450f8c76ee138b1d53befd91b735652b.cab 95=3eaef6a740a72a55f4a0ac3039d05419.cab 96=1620efa4ffe2a6563530bd0158b17fe6.cab 97=125b1c8c81e36ec9dbe5abf370ff9919.cab 98=fa7c072a4c8f9cf0f901146213ebbce7.cab 99=94cae441bc5628e21814208a973bbb9d.cab 100=f8f7800500b180b8a2103c40ce94f56a.cab 101=b5227bb68c3d4641d71b769e3ac606a1.cab 102=1f90b0f7321fab8dcdedaba3b30415f3.cab 103=d519967dbb262c80060d9efb5079aa23.cab 104=a30d7a714f70ca6aa1a76302010d7914.cab 105=b3892d561b571a5b8c81d33fbe2d6d24.cab 106=aa4db181ead2227e76a3d291da71a672.cab 107=8c27542f7954c25af62730fbb1e211d2.cab 108=7ab29d7f105f1e7814198f23b60f8e5d.cab 109=0d981f062236baed075df3f42b1747db.cab 110=a03686381bcfa98a14e9c579f7784def.cab 111=3585b51691616d290315769bec85eb6f.cab 112=fd5778f772c39c09c3dd8cd99e7f0543.cab 113=57007192b3b38fcd019eb88b021e21cc.cab 114=c6babfeb2e1e6f814e70cacb52a0f923.cab 115=fbcf182748fd71a49becc8bb8d87ba92.cab 116=17c9d60f2bc5bc54c58782d614afcbf0.cab 117=3dc1ed76e5648b575ed559e37a1052f0.cab 118=6d2cfb2c5343c33c8d9e54e7d1f613f9.cab 119=625aa8d1c0d2b6e8cf41c50b53868ecd.cab 120=45c632fb53b95fe3bd58a6242325afa6.cab 121=d5abe4833b23e13dc7038bde9c525069.cab 122=ac9ff098e23012b74624db792b538132.cab 123=cfb8342932e6752026b63046a8d93845.cab 124=bd748d6fbff59b2a58cebdb99c3c6747.cab 125=38d93b8047d5efb04cf01ab7ec66d090.cab 126=39837d43d71c401e7edc9ba3e569cd69.cab 127=0708be5ffbe332f6a1571c929c1322a5.cab 128=3814eaa1d4e897c02ac4ca93e7e7796a.cab 129=7011bf2f8f7f2df2fdd2ed7c82053d7f.cab 130=ab3291752bc7a02f158066789e9b0c03.cab 131=c0f42c479da796da513cc5592f0759d3.cab 132=3611bd81544efa3deb061718f15aee0c.cab 133=0302dc615b0a5fd4810430b2cdacb5e3.cab 134=6dc62760f8235e462db8f91f6eaa1d90.cab 135=268b1a41f6bd2906449944b964bf7393.cab 136=527b957c06e68ebb115b41004f8e3ad0.cab 137=a1d26d38d4197f7873a8da3a26fc351c.cab 138=6bdcd388323175da70d836a25654aa92.cab 139=11bdc4a4637c4d7ab86107fd13dcb9c6.cab 140=7c11b295fb7f25c6d684b1957e96a226.cab 141=77adc85e5c49bbd36a91bb751dc55b39.cab 142=732eefaf52275b7a708311a31c82c814.cab 143=ed711e0a0102f1716cc073671804eb4c.cab 144=bc1fef9daa903321722c08ce3cf51261.cab 145=SQLEXPR_x86_ENU.exe 146=Windows Assessment Services-x86_en-us.msi 147=7c195d91008a0a6ad16e535ac228467d.cab 148=eebe1a56de59fd5a57e26205ff825f33.cab 149=6894c1e1e549c4ab533078e3ff2e92af.cab 150=Windows Assessment Services - Client (Server SKU)-x86_en-us.msi 151=5775a15b7f297f3e705a74609cb21bbc.cab 152=18e5e442fc73caa309725c0a69394a46.cab 153=Windows Assessment Services - Client (AMD64 Architecture Specific, Server SKU)-x86_en-us.msi 154=Assessments on Server-x86_en-us.msi 155=wasinstaller.exe 156=Windows Assessment Services - Client (Client SKU)-x86_en-us.msi 157=Windows Assessment Services - Client (X86 Architecture Specific, Client SKU)-x86_en-us.msi 158=Windows Assessment Services - Client (AMD64 Architecture Specific, Client SKU)-x86_en-us.msi 159=Kits Configuration Installer-x86_en-us.msi '@ } $PatchesURLs = DATA { ConvertFrom-StringData @' 0=Toolkit Documentation-x86_en-us.msp 1=Application Compatibility Toolkit-x86_en-us.msp 2=Application Compatibility Toolkit-x64_en-us.msp 3=Windows Deployment Tools-x86_en-us.msp 4=Windows System Image Manager on amd64-x86_en-us.msp 5=Windows System Image Manager on x86-x86_en-us.msp 6=Windows PE x86 x64-x86_en-us.msp 7=User State Migration Tool-x86_en-us.msp 8=Volume Activation Management Tool-x86_en-us.msp 9=WPTx86-x86_en-us.msp 10=WPTx64-x86_en-us.msp 11=WPT Redistributables-x86_en-us.msp 12=Windows Assessment Toolkit-x86_en-us.msp 13=Assessments on Client-x86_en-us.msp 14=Windows Assessment Services-x86_en-us.msp 15=Windows Assessment Services - Client (Server SKU)-x86_en-us.msp 16=Assessments on Server-x86_en-us.msp 17=Windows Assessment Services - Client (Client SKU)-x86_en-us.msp '@ } "Installers","Patches\8.100.26629" | ForEach-Object -Process { # Create target folders if required as BIT doesn't accept missing folders If (-not(Test-Path (Join-Path -Path $TargetFolder -ChildPath $_))) { try { New-Item -Path (Join-Path -Path $TargetFolder -ChildPath $_) -ItemType Directory -Force @HT } catch { Write-Warning -Message "Failed to create folder $($TargetFolder)/$_" break } } } # Get adksetup.exe Invoke-WebRequest -Uri "$($MainURL)adksetup.exe" -OutFile "$($TargetFolder)\adksetup.exe" # Create a job that will downlad our first file $job = Start-BitsTransfer -Suspended -Source "$($MainURL)Installers/$($InstallerURLs['0'])" -Asynchronous -Destination (Join-Path -Path $TargetFolder -ChildPath ("Installers/$($InstallerURLs['0'])")) # Downlod installers For ($i = 1 ; $i -lt $InstallerURLs.Count ; $i++) { $URL = $Destination = $null $URL = "$($MainURL)Installers/$($InstallerURLs[$i.ToString()])" $Destination = Join-Path -Path (Join-Path -Path $TargetFolder -ChildPath Installers) -ChildPath (([URI]$URL).Segments[-1] -replace '%20'," ") # Add-BitsFile http://technet.microsoft.com/en-us/library/dd819411.aspx $newjob = Add-BitsFile -BitsJob $job -Source $URL -Destination $Destination Write-Progress -Activity "Adding file $($newjob.FilesTotal)" -Status "Percent completed: " -PercentComplete (($newjob.FilesTotal)*100/($InstallerURLs.Count)) } # Donwload Patches For ($i = 0 ; $i -lt $PatchesURLs.Count ; $i++) { $URL = $Destination = $null $URL = "$($MainURL)Patches/8.100.26629/$($PatchesURLs[$i.ToString()])" $Destination = Join-Path -Path (Join-Path -Path $TargetFolder -ChildPath "Patches/8.100.26629") -ChildPath (([URI]$URL).Segments[-1] -replace '%20'," ") # Add-BitsFile http://technet.microsoft.com/en-us/library/dd819411.aspx $newjob = Add-BitsFile -BitsJob $job -Source $URL -Destination $Destination } # Begin the download and show us the job Resume-BitsTransfer -BitsJob $job -Asynchronous # http://msdn.microsoft.com/en-us/library/windows/desktop/ee663885%28v=vs.85%29.aspx while ($job.JobState -in @('Connecting','Transferring','Queued')) { Write-Progress -activity "Downloading ADK files" -Status "Percent completed: " -PercentComplete ($job.BytesTransferred*100/$job.BytesTotal) } Switch($job.JobState) { "Transferred" { Complete-BitsTransfer -BitsJob $job break } "Error" { # List the errors. $job | Format-List } default { # Perform corrective action. } } } } End {} }
Then I tested the function like this:
- I created the target folder
- I dotsourced the script
- I launched the download
- I compared the downloaded files made with the webinstaller and my function.
If you don’t create it and try to launch the function, you’ll get the following warning:
Bonus:
The following links are still valid to obtain the:
- ADK release notes: http://msdn.microsoft.com/en-us/library/windows/hardware/hh825613.aspx
- ADK 8.1 web installer/downloader official link on the download center: http://www.microsoft.com/en-us/download/details.aspx?id=39982