Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <# : standard way of doing hybrid batch + powershell scripts
- @title Win10+ Setup Disk 2.7 &color 3E
- @set "__ARGS__=%*" &powershell -noprofile "$ScriptPath='%~f0';iex((Get-Content('%~f0') -Raw))" &exit/b
- #>
- #
- # Homepage: https://forums.mydigitallife.net/threads/win10-setup-disk-works-with-uefi-with-secure-boot-bios-install-wim-over-4-gb.79268/
- # Credits: @rpo, @freddie-o, @BAU & @abbodi1406
- #
- # This script must be executed with admin privilege
- #
- # Test Administrator privileges
- If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
- {
- $uac_error="Elevating UAC for Administrator Privileges failed"
- # The following test is to avoid infinite looping if elevating UAC for Administrator Privileges failed
- if ($env:__ARGS__ -eq $uac_error) {
- read-host "$uac_error`r`nRight click on the script and select ""Run as administrator""`r`nPress Enter to exit...";exit}
- # Restart the script to get Administrator privileges and exit
- Start-Process "$ScriptPath" $uac_error -Verb runAs; exit
- }
- $pswindow = $host.ui.rawui # create a reference to the console’s UI.RawUI child object
- $pswindow.windowtitle = ([string]($pswindow.windowtitle -split "^.* ")).trim() ; $ShortTitle=($pswindow.windowtitle -split " @ .*")[0]
- #
- Add-Type -AssemblyName System.Windows.Forms # Load the class System.Windows.Forms
- # Filebrowser dialog object
- $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{
- Multiselect = $false # One file can be chosen
- Filter = 'ISO images (*.iso)|*.iso' # Select only iso files
- }
- #
- Function MsgBox {[System.Windows.Forms.MessageBox]::Show($Args[0],$ShortTitle,$Args[1],$Args[2])}
- #
- Function Update_bcd
- {
- param ($iso, $usbpartition)
- "Set bootmenupolicy Legacy for $usbpartition"
- Copy-Item "$iso\boot\bcd" "$usbpartition\boot\bcd" -Force
- Copy-Item "$iso\EFI\Microsoft\boot\bcd" "$usbpartition\EFI\Microsoft\boot\bcd" -Force
- & bcdedit /store "$usbpartition\boot\bcd" /set '{default}' bootmenupolicy Legacy |Out-Null
- & bcdedit /store "$usbpartition\EFI\Microsoft\boot\bcd" /set '{default}' bootmenupolicy Legacy |Out-Null
- Set-ItemProperty -Path "$usbpartition\boot\bcd" -Name IsReadOnly -Value $true
- Set-ItemProperty -Path "$usbpartition\EFI\Microsoft\boot\bcd" -Name IsReadOnly -Value $true
- remove-item "$usbpartition\boot\bcd.*" -force
- remove-item "$usbpartition\EFI\Microsoft\boot\bcd.*" -force
- }
- #
- clear-host
- $USB=$Null
- $Form=New-Object System.Windows.Forms.Form # Create the screen form (window)
- $Form.TopMost = $True
- # Set the title and size of the window:
- $Form.Text=$ShortTitle
- $Form.Font='Consolas,10'
- $Form.Width=420 ; $Form.Height=270
- $Form.StartPosition = "CenterScreen"
- $Form.SizeGripStyle = "Hide"
- [System.Windows.Forms.Application]::EnableVisualStyles();
- # Add a Source Windows ISO label on the form
- $SourceISO=New-Object System.Windows.Forms.Label
- $SourceISO.Location=New-Object System.Drawing.Point(20,30)
- $SourceISO.Size=New-Object System.Drawing.Size(200,20)
- $SourceISO.text="Source Windows ISO"
- $Form.Controls.Add($SourceISO)
- # Add the ISO file name on the form
- $ISOFile=New-Object System.Windows.Forms.Label
- $ISOFile.Location=New-Object System.Drawing.Point(20,50)
- $ISOFile.Text=" "
- $ISOFile.Size=New-Object System.Drawing.Size(364,24)
- $ISOFile.Backcolor = [System.Drawing.Color]::White
- $ISOFile.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
- $Form.Controls.Add($ISOFile)
- # Add a Target USB Disk label on the form
- $TargetUSB=New-Object System.Windows.Forms.Label
- $TargetUSB.Location=New-Object System.Drawing.Point(20,100)
- $TargetUSB.Text="Target USB Disk"
- $TargetUSB.Size=New-Object System.Drawing.Size(200,20)
- $Form.Controls.Add($TargetUSB)
- # Create a USB Disk drop-down list and fill it
- $USBDiskList=New-Object System.Windows.Forms.ComboBox
- $USBDiskList.DropDownStyle=[System.Windows.Forms.ComboBoxStyle]::DropDownList;
- $USBDiskList.Location=New-Object System.Drawing.Point(20,120)
- $USBDiskList.Size=New-Object System.Drawing.Size(363,22)
- $Form.Controls.Add($SelectUSBDiskList)
- $USBDisks=@() # array with USB disk number
- #
- $Disks=$Null;While (!$Disks){
- If(!($Disks=Get-Disk | Where-Object {($_.BusType -eq "USB") -and ($_.OperationalStatus -eq "Online")})){
- If((MsgBox "Plug in your USB disk first. `n`nClick OK to continue." "OKCancel" "Information") -eq "Cancel") {exit}}}
- # Add a Select ISO button on the form
- $SelectISOButton=New-Object System.Windows.Forms.Button
- $SelectISOButton.Location=New-Object System.Drawing.Point(20,185)
- $SelectISOButton.Text="Select ISO"
- $SelectISOButton.Size=New-Object System.Drawing.Size(110,26)
- $Form.Controls.Add($SelectISOButton)
- # Add a Create Setup Disk button on the form
- $CreateDiskButton=New-Object System.Windows.Forms.Button
- $CreateDiskButton.Location=New-Object System.Drawing.Point(140,185)
- $CreateDiskButton.Text="Create Setup Disk"
- $CreateDiskButton.Size=New-Object System.Drawing.Size(155,26)
- $Form.Controls.Add($CreateDiskButton)
- $CreateDiskButton.Enabled = $false
- $CreateDiskButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
- # Add a Cancel button on the form
- $CancelButton=New-Object System.Windows.Forms.Button
- $CancelButton.Location=New-Object System.Drawing.Point(305,185)
- $CancelButton.Text="Cancel"
- $CancelButton.Size=New-Object System.Drawing.Size(80,26)
- $Form.Controls.Add($CancelButton)
- $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
- #
- $SelectISOButton.Add_Click({
- If ($FileBrowser.ShowDialog() -ne "Cancel"){ # if Cancel, just ignore
- $Global:ImagePath = $FileBrowser.filename # return the file name
- $ISOFile.Text= Split-Path -Path $ImagePath -leaf # extract filename and extension (iso)
- if (($ISOFile.Text).length -gt 44) {$ISOFile.Text = $ImagePath.PadRight(100," ").substring(0,43)+"..."}
- $CreateDiskButton.Enabled = $true
- $CreateDiskButton.Focus()}})
- Foreach ($USBDisk in $Disks) {
- $FriendlyName=($USBDisk.FriendlyName).PadRight(40," ").substring(0,39)
- $USBDisks+=$USBDisk.DiskNumber
- $USBDiskList.Items.Add(("{0,-39}{1:n2} GB" -f $FriendlyName,($USBDisk.Size/1GB)))|out-null
- If ($Partitions) {
- Foreach ($Partition in $Partitions) {
- If(!$Partition.DriveLetter){$AccessPath=" "} Else {$AccessPath=$Partition.DriveLetter+":"}
- $Volumes=get-volume | Where-Object {$Partition.AccessPaths -contains $_.path }
- Foreach ($Volume in $Volumes) {
- $USBDisks+=$USBDisk.DiskNumber
- $USBDiskList.Items.Add(("{0,0}({1,2}){2,-32}[{3:n2} GB]" -f " ", ($AccessPath), $Volume.FileSystemLabel.PadRight(25," ").substring(0,25), ($Partition.Size/1GB)))|out-null
- }
- }
- }
- }
- $form.Controls.Add($USBDiskList)
- $USBDiskList.SelectedIndex=0
- #
- $Groupbox=New-Object System.Windows.Forms.Groupbox # Add a group box on the form
- $Groupbox.Location=New-Object System.Drawing.Point(7,0)
- $Groupbox.Text=""
- $Groupbox.Size=New-Object System.Drawing.Size(390,225)
- $Form.Controls.Add($Groupbox)
- #
- @"
- 1. Select ISO (Source Windows ISO)
- 2. Select Target USB disk
- 3. Create Setup Disk
- "@| Write-Host
- #
- if($form.ShowDialog() -eq "Cancel") {MsgBox "The script was cancelled." "OK" "Information"|out-Null;exit}
- #
- # At this point the mounted USB disk and the iso image file path are defined
- #
- $USB=$USBDisks[$USBDiskList.SelectedIndex]
- #
- If((MsgBox "WARNING! `n`nYour USB disk will be converted to MBR scheme, repartitioned and reformatted.`n`nAll partitions and data currently stored in the USB disk will be erased.`r`n`r`nAre you sure you want to continue?" "YESNO" "Warning") -eq "NO"){exit}
- # Mount the image file if not already mounted and get the drive letter
- #
- # Check if iso already mounted by getting driveletter
- If($ISO=(Get-DiskImage -ImagePath $ImagePath | Get-Volume).DriveLetter){$Mounted=$True} Else
- # Mount iso and get drive letter
- {$Mounted=$False; Mount-DiskImage -ImagePath $ImagePath -StorageType ISO |out-null
- If(!($ISO=(Get-DiskImage -ImagePath $ImagePath | Get-Volume).DriveLetter)){Exit}}
- $ISO=$ISO+":"
- #
- Clear-Host
- # Clear the USB disk
- @"
- Select disk $USB
- clean
- convert MBR
- rescan
- exit
- "@ | diskpart
- Stop-Service ShellHWDetection -erroraction silentlycontinue|out-null
- # Create the fat32 boot partition
- $usbfat32=(New-Partition -DiskNumber $usb -Size 1GB -AssignDriveLetter | Format-Volume -FileSystem FAT32 -NewFileSystemLabel "BOOT").DriveLetter + ":"
- # Copy needed files to the fat32 boot partition
- robocopy $iso"\" $usbfat32"\" bootmgr bootmgr.efi
- robocopy $iso"\boot" $usbfat32"\boot" /e /xf $iso\boot\bcd
- robocopy $iso"\efi" $usbfat32"\efi" /e /xf $iso\efi\microsoft\boot\bcd
- robocopy $iso"\sources" $usbfat32"\sources" boot.wim
- Update_BCD $iso $usbfat32
- # Remove the drive letter to hide the device
- Get-Volume -DriveLetter $usbfat32.substring(0,$usbfat32.Length-1) | Get-Partition | Remove-PartitionAccessPath -accesspath $usbfat32
- # Create the NTFS intall partition
- $usbntfs=(New-Partition -DiskNumber $usb -UseMaximumSize -AssignDriveLetter -IsActive | Format-Volume -FileSystem NTFS -NewFileSystemLabel "SETUP").DriveLetter + ":"
- Start-Service ShellHWDetection -erroraction silentlycontinue|out-null
- # Copy needed files to the NTFS install partition
- robocopy $iso $usbntfs /e /xf $iso\boot\bcd $iso\efi\microsoft\boot\bcd
- Update_BCD $iso $usbntfs
- # Eject the mounted iso image if it was loaded by the script
- If(!$Mounted){DisMount-DiskImage -ImagePath $ImagePath |out-null}
- MsgBox (($ShortTitle -split " @.*")[0]+" was created successfully.") "OK" "Information" |Out-Null;exit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement