Public/Functions/split/New-Bootable.usb.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
function New-Bootable.usb { [CmdletBinding()] param ( [ValidateLength(0,11)] [string]$BootLabel = 'USB Boot', [ValidateLength(0,32)] [string]$DataLabel = 'USB Data' ) #================================================= # Start the Clock #================================================= $osdbootStartTime = Get-Date #================================================= # Set Variables #================================================= $ErrorActionPreference = 'Stop' $MinimumSizeGB = 7 $MaximumSizeGB = 2000 #================================================= # Block #================================================= Block-StandardUser Block-WindowsVersionNe10 Block-PowerShellVersionLt5 Block-WindowsReleaseIdLt1703 #================================================= # Disable Autorun #================================================= Set-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer' -Name NoDriveTypeAutorun -Type DWord -Value 0xFF -ErrorAction SilentlyContinue #================================================= # Select-Disk.usb # Select a USB Disk #================================================= Write-Verbose '$SelectDisk = Select-Disk.usb -MinimumSizeGB $MinimumSizeGB -MaximumSizeGB $MaximumSizeGB' $SelectDisk = Select-Disk.usb -MinimumSizeGB $MinimumSizeGB -MaximumSizeGB $MaximumSizeGB #================================================= # Select-Disk.usb # Select a USB Disk #================================================= if (-NOT ($SelectDisk)) { Write-Warning "No USB Drives that met the required criteria were detected" Write-Warning "MinimumSizeGB: $MinimumSizeGB" Write-Warning "MaximumSizeGB: $MaximumSizeGB" Break } #================================================= # Get-Disk.osd -BusType USB # At this point I have the Disk object in $GetUSBDisk #================================================= Write-Verbose '$GetUSBDisk = Get-Disk.osd -BusType USB -Number $SelectDisk.Number' $GetUSBDisk = Get-Disk.osd -BusType USB -Number $SelectDisk.Number #================================================= # Clear-Disk # Prompt for Confirmation #================================================= if ($GetUSBDisk.NumberOfPartitions -eq 0) { Write-Verbose "Disk does not have any partitions. This is a good thing!" } else { Write-Verbose '$GetUSBDisk | Clear-Disk -RemoveData -RemoveOEM -Confirm:$true' $GetUSBDisk | Clear-Disk -RemoveData -RemoveOEM -Confirm:$true -ErrorAction Stop } #================================================= # Get-Disk.osd -BusType USB # Run another Get-Disk to make sure that things are ok #================================================= Write-Verbose '$GetUSBDisk = Get-Disk.osd -BusType USB -Number $SelectDisk.Number | Where-Object {$_.NumberOfPartitions -eq 0}' $GetUSBDisk = Get-Disk.osd -BusType USB -Number $SelectDisk.Number | Where-Object {$_.NumberOfPartitions -eq 0} if (-NOT ($GetUSBDisk)) { Write-Warning "Something went very very wrong in this process" Break } #================================================= # -lt 2TB #================================================= if ($GetUSBDisk.PartitionStyle -eq 'RAW') { Write-Verbose '$GetUSBDisk | Initialize-Disk -PartitionStyle MBR' $GetUSBDisk | Initialize-Disk -PartitionStyle MBR -ErrorAction Stop } if ($GetUSBDisk.PartitionStyle -eq 'GPT') { Write-Verbose '$GetUSBDisk | Set-Disk -PartitionStyle MBR' $GetUSBDisk | Set-Disk -PartitionStyle MBR -ErrorAction Stop } if ($GetUSBDisk.SizeGB -le 2000) { Write-Verbose '$DataDisk = $GetUSBDisk | New-Partition -Size ($GetUSBDisk.Size - 2GB) -AssignDriveLetter | Format-Volume -FileSystem NTFS -NewFileSystemLabel $DataLabel' $DataDisk = $GetUSBDisk | New-Partition -Size ($GetUSBDisk.Size - 2GB) -AssignDriveLetter | Format-Volume -FileSystem NTFS -NewFileSystemLabel $DataLabel -ErrorAction Stop Write-Verbose '$BootDisk = $GetUSBDisk | New-Partition -UseMaximumSize -IsActive -AssignDriveLetter | Format-Volume -FileSystem FAT32 -NewFileSystemLabel $BootLabel' $BootDisk = $GetUSBDisk | New-Partition -UseMaximumSize -IsActive -AssignDriveLetter | Format-Volume -FileSystem FAT32 -NewFileSystemLabel $BootLabel -ErrorAction Stop } #================================================= # -ge 2TB # This is not working as expected and will probably not be bootable # So leaving it in here for historic purposes #================================================= <# if ($GetUSBDisk.SizeGB -gt 1800) { $GetUSBDisk | Initialize-Disk -PartitionStyle GPT $DataDisk = $GetUSBDisk | New-Partition -Size ($GetUSBDisk.Size - 2GB) -AssignDriveLetter | ` Format-Volume -FileSystem NTFS -NewFileSystemLabel $DataLabel $BootDisk = $GetUSBDisk | New-Partition -GptType "{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}" -UseMaximumSize -AssignDriveLetter | ` Format-Volume -FileSystem FAT32 -NewFileSystemLabel $BootLabel } #> #================================================= # Complete #================================================= $osdbootEndTime = Get-Date $osdbootTimeSpan = New-TimeSpan -Start $osdbootStartTime -End $osdbootEndTime Write-Host -ForegroundColor DarkGray "================================================" Write-Host -ForegroundColor Yellow "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) $($MyInvocation.MyCommand.Name) " -NoNewline Write-Host -ForegroundColor Cyan "Completed in $($osdbootTimeSpan.ToString("mm' minutes 'ss' seconds'"))" #================================================= # Return #================================================= Return (Get-Disk.osd -BusType USB -Number $SelectDisk.Number) #================================================= } |