2016-01: Retroactive Updates
This commit is contained in:
parent
c7b5abb0bc
commit
41272c03ab
6 changed files with 263 additions and 111 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2015 Alan Mason
|
Copyright (c) 2016 Alan Mason
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
:Init
|
:Init
|
||||||
setlocal EnableDelayedExpansion
|
setlocal EnableDelayedExpansion
|
||||||
title Menu Launcher
|
title Menu Launcher
|
||||||
color 0a
|
color 0b
|
||||||
pushd %~dp0
|
pushd %~dp0
|
||||||
|
|
||||||
:Flags
|
:Flags
|
||||||
|
|
@ -30,5 +30,7 @@ echo.
|
||||||
rem echo Press any key to exit...
|
rem echo Press any key to exit...
|
||||||
rem pause>nul
|
rem pause>nul
|
||||||
popd
|
popd
|
||||||
color
|
endlocal
|
||||||
endlocal
|
cls
|
||||||
|
echo Careful now...
|
||||||
|
echo.
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
|
color 0b
|
||||||
echo Initializing...
|
echo Initializing...
|
||||||
wpeinit
|
wpeinit
|
||||||
wpeutil updatebootinfo
|
wpeutil updatebootinfo
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ pushd "$wd"
|
||||||
clear
|
clear
|
||||||
$host.UI.RawUI.WindowTitle = "WK PE Tool"
|
$host.UI.RawUI.WindowTitle = "WK PE Tool"
|
||||||
$logpath = "$WKPath\Info\$date"
|
$logpath = "$WKPath\Info\$date"
|
||||||
md "$logpath" 2>&1 | out-null
|
md "$logpath" 2>&1 | Out-Null
|
||||||
$log = "$logpath\winpe.log"
|
$log = "$logpath\winpe.log"
|
||||||
$source_server = "10.0.0.10"
|
$source_server = "10.0.0.10"
|
||||||
$backup_servers = @(
|
$backup_servers = @(
|
||||||
|
|
@ -20,23 +20,23 @@ $backup_servers = @(
|
||||||
"letter"="Y";
|
"letter"="Y";
|
||||||
"path"="Backups"}
|
"path"="Backups"}
|
||||||
)
|
)
|
||||||
$backup_user = "WORKGROUP\backup"
|
$backup_user = "backup"
|
||||||
$backup_pass = "Abracadabra"
|
$backup_pass = "Abracadabra"
|
||||||
|
|
||||||
# Functions
|
# Functions
|
||||||
function apply-image {
|
function apply-image {
|
||||||
param([string]$image, [int]$index)
|
Param([string]$image, [int]$index)
|
||||||
$path = ""
|
$path = ""
|
||||||
$split_image = $false
|
$split_image = $false
|
||||||
$split_image_pattern = ""
|
$split_image_pattern = ""
|
||||||
|
|
||||||
# Check for local source
|
# Check for local source
|
||||||
$volumes = get-volume | where {$_.Size -ne 0 -and $_.DriveLetter -match '^[C-Z]$'}
|
$volumes = Get-Volume | Where-Object {$_.Size -ne 0 -and $_.DriveLetter -match '^[C-Z]$'}
|
||||||
foreach ($v in $volumes) {
|
foreach ($v in $volumes) {
|
||||||
$letter = $v.DriveLetter + ":"
|
$letter = $v.DriveLetter + ":"
|
||||||
if (test-path "$letter\sources\$image.wim") {
|
if (Test-Path "$letter\sources\$image.wim") {
|
||||||
$path = "$letter\sources\$image.wim"
|
$path = "$letter\sources\$image.wim"
|
||||||
} elseif (test-path "$letter\sources\$image.swm") {
|
} elseif (Test-Path "$letter\sources\$image.swm") {
|
||||||
$path = "$letter\sources\$image.swm"
|
$path = "$letter\sources\$image.swm"
|
||||||
$split_image = $true
|
$split_image = $true
|
||||||
$split_image_pattern = "$letter\sources\$image*.swm"
|
$split_image_pattern = "$letter\sources\$image*.swm"
|
||||||
|
|
@ -46,9 +46,9 @@ function apply-image {
|
||||||
# Check for remote source (if necessary)
|
# Check for remote source (if necessary)
|
||||||
if ($path -match '^$') {
|
if ($path -match '^$') {
|
||||||
net use z: "\\$source_server\Windows" /user:guest notarealpassword
|
net use z: "\\$source_server\Windows" /user:guest notarealpassword
|
||||||
if (test-path "Z:\$image.wim") {
|
if (Test-Path "Z:\$image.wim") {
|
||||||
$path = "Z:\$image.wim"
|
$path = "Z:\$image.wim"
|
||||||
} elseif (test-path "Z:\$image.swm") {
|
} elseif (Test-Path "Z:\$image.swm") {
|
||||||
$path = "Z:\$image.swm"
|
$path = "Z:\$image.swm"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -65,7 +65,7 @@ function apply-image {
|
||||||
net use z: /delete
|
net use z: /delete
|
||||||
}
|
}
|
||||||
function format-gpt {
|
function format-gpt {
|
||||||
param($dest_disk)
|
Param($dest_disk)
|
||||||
wk-write "Drive will use a GPT (UEFI) layout."
|
wk-write "Drive will use a GPT (UEFI) layout."
|
||||||
|
|
||||||
# Double-check we have the right drive
|
# Double-check we have the right drive
|
||||||
|
|
@ -77,9 +77,9 @@ function format-gpt {
|
||||||
}
|
}
|
||||||
$diskpart_script = "select disk {0}`r`n" -f $dest_disk.DiskNumber
|
$diskpart_script = "select disk {0}`r`n" -f $dest_disk.DiskNumber
|
||||||
$diskpart_script += "uniqueid disk"
|
$diskpart_script += "uniqueid disk"
|
||||||
out-file -encoding 'UTF8' -filepath "$wd\diskpart.script" -inputobject $diskpart_script
|
Out-File -encoding 'UTF8' -filepath "$wd\diskpart.script" -inputobject $diskpart_script
|
||||||
start "diskpart" -argumentlist @("/s", "$wd\diskpart.script") -wait -nonewwindow -PassThru -RedirectStandardOutput "$wd\drive_uid" | out-null
|
Start-Process "diskpart" -argumentlist @("/s", "$wd\diskpart.script") -wait -nonewwindow -PassThru -RedirectStandardOutput "$wd\drive_uid" | Out-Null
|
||||||
if (!(Get-Content "$wd\drive_uid" | where {$_ -imatch $_sel_uid})) {
|
if (!(Get-Content "$wd\drive_uid" | Where-Object {$_ -imatch $_sel_uid})) {
|
||||||
# GUIDs do not match
|
# GUIDs do not match
|
||||||
wk-error "Diskpart failed to select the same disk for formatting, aborting setup."
|
wk-error "Diskpart failed to select the same disk for formatting, aborting setup."
|
||||||
wk-warn "This system requires manual formatting & setup"
|
wk-warn "This system requires manual formatting & setup"
|
||||||
|
|
@ -122,16 +122,16 @@ function format-gpt {
|
||||||
$diskpart_script += "assign letter='W'`r`n"
|
$diskpart_script += "assign letter='W'`r`n"
|
||||||
|
|
||||||
# Run script
|
# Run script
|
||||||
out-file -encoding 'UTF8' -filepath "$wd\diskpart.script" -inputobject $diskpart_script
|
Out-File -encoding 'UTF8' -filepath "$wd\diskpart.script" -inputobject $diskpart_script
|
||||||
start "diskpart" -argumentlist @("/s", "$wd\diskpart.script") -wait -nonewwindow
|
Start-Process "diskpart" -argumentlist @("/s", "$wd\diskpart.script") -wait -nonewwindow
|
||||||
}
|
}
|
||||||
function format-mbr {
|
function format-mbr {
|
||||||
param($dest_disk)
|
Param($dest_disk)
|
||||||
wk-write "Drive will use a MBR (legacy) layout."
|
wk-write "Drive will use a MBR (legacy) layout."
|
||||||
|
|
||||||
if ($dest_disk.PartitionStyle -notmatch '^RAW$') {
|
if ($dest_disk.PartitionStyle -notmatch '^RAW$') {
|
||||||
# Only clean if necessary
|
# Only clean if necessary
|
||||||
clear-Disk $dest_disk.DiskNumber -RemoveData -RemoveOEM -Confirm:$false
|
Clear-Disk $dest_disk.DiskNumber -RemoveData -RemoveOEM -Confirm:$false
|
||||||
}
|
}
|
||||||
Initialize-Disk $dest_disk.DiskNumber -PartitionStyle 'MBR'
|
Initialize-Disk $dest_disk.DiskNumber -PartitionStyle 'MBR'
|
||||||
New-Partition -DiskNumber $dest_disk.DiskNumber -Size 100Mb -DriveLetter 'S' -IsActive:$true
|
New-Partition -DiskNumber $dest_disk.DiskNumber -Size 100Mb -DriveLetter 'S' -IsActive:$true
|
||||||
|
|
@ -139,6 +139,120 @@ function format-mbr {
|
||||||
Format-Volume -DriveLetter 'S' -FileSystem 'NTFS' -NewFileSystemLabel 'System Reserved'
|
Format-Volume -DriveLetter 'S' -FileSystem 'NTFS' -NewFileSystemLabel 'System Reserved'
|
||||||
Format-Volume -DriveLetter 'W' -FileSystem 'NTFS' -NewFileSystemLabel 'Windows'
|
Format-Volume -DriveLetter 'W' -FileSystem 'NTFS' -NewFileSystemLabel 'Windows'
|
||||||
}
|
}
|
||||||
|
function select-disk {
|
||||||
|
$_skipped_parts = 0
|
||||||
|
# Check if any source drives were detected
|
||||||
|
$disks = Get-Disk | Where-Object {$_.Size -ne 0} | Sort-Object -Property "Number"
|
||||||
|
if ($disks.count -eq 0) {
|
||||||
|
wk-error "No suitable source drives were detected."
|
||||||
|
return $false
|
||||||
|
} elseif ($disks.count -eq $null) {
|
||||||
|
# Assuming only one disk is available
|
||||||
|
$answer = $disks.DiskNumber
|
||||||
|
} else {
|
||||||
|
# Build source menu
|
||||||
|
$menu_imaging_source = "For which drive are we creating backup image(s)?`r`n`r`n"
|
||||||
|
$valid_answers = @("M", "m")
|
||||||
|
foreach ($_ in $disks) {
|
||||||
|
$valid_answers += $_.DiskNumber
|
||||||
|
$menu_imaging_source += "{0}: {1,4:N0} Gb`t[{2}] ({3}) {4}`r`n" -f $_.DiskNumber, ($_.Size / 1GB), $_.PartitionStyle, $_.BusType, $_.FriendlyName
|
||||||
|
}
|
||||||
|
$menu_imaging_source += "`r`n"
|
||||||
|
$menu_imaging_source += "M: Main Menu`r`n"
|
||||||
|
$menu_imaging_source += "`r`n"
|
||||||
|
$menu_imaging_source += "Please make a selection`r`n"
|
||||||
|
|
||||||
|
# Select source
|
||||||
|
do {
|
||||||
|
clear
|
||||||
|
$answer = read-host -prompt $menu_imaging_source
|
||||||
|
} until ($valid_answers -contains $answer)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($answer -imatch '^\d+$') {
|
||||||
|
# Valid disk selected
|
||||||
|
clear
|
||||||
|
$_d = Get-Disk -number $answer
|
||||||
|
$_disk_details = "Disk:`t{0,4:N0} Gb`t[{1}] ({2}) {3}" -f ($_d.Size / 1GB), $_d.PartitionStyle, $_d.BusType, $_d.FriendlyName
|
||||||
|
wk-write "$_disk_details"
|
||||||
|
wk-write "Partition(s):"
|
||||||
|
|
||||||
|
# Print partition info
|
||||||
|
$partitions = Get-Partition -DiskNumber $_d.DiskNumber
|
||||||
|
foreach ($_p in $partitions) {
|
||||||
|
# Assign letter
|
||||||
|
Add-PartitionAccessPath -DiskNumber $_d.DiskNumber -PartitionNumber $_p.PartitionNumber -AssignDriveLetter 2>&1 | Out-Null
|
||||||
|
|
||||||
|
# Update partition info
|
||||||
|
$_p = Get-Partition -DiskNumber $_d.DiskNumber -PartitionNumber $_p.PartitionNumber
|
||||||
|
$_v = Get-Volume -Partition $_p
|
||||||
|
|
||||||
|
# Set size label
|
||||||
|
$_size = (human-size $_p.size 0)
|
||||||
|
if ($_v -ne $null) {
|
||||||
|
$_used = (human-size ($_v.Size - $_v.SizeRemaining) 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print partition info
|
||||||
|
if ($_p.AccessPaths -eq $null) {
|
||||||
|
# No drive letter
|
||||||
|
$_msg = " *{0:N0}:`t ({1}) {2}" -f $_p.PartitionNumber, $_size, $_p.Type
|
||||||
|
wk-error "$_msg"
|
||||||
|
$_skipped_parts += 1
|
||||||
|
} else {
|
||||||
|
# Has drive letter
|
||||||
|
$_path = $_p.AccessPaths | Where-Object {$_ -imatch '^\w:\\$'}
|
||||||
|
$_label = " {0}" -f $_p.Type
|
||||||
|
if ($_v -and $_v.FileSystemLabel -ne "") {
|
||||||
|
$_label = '"{0}"' -f $_v.FileSystemLabel
|
||||||
|
}
|
||||||
|
$_msg = " {0:N0}:`t{1} ({2,6}) {3} ({4} used)" -f $_p.PartitionNumber, $_path, $_size, $_label, $_used
|
||||||
|
wk-write "$_msg"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($_skipped_parts -gt 0) {
|
||||||
|
wk-warn " *`tUnable to backup these partition(s)"
|
||||||
|
}
|
||||||
|
wk-write ""
|
||||||
|
if (ask " Backup these partition(s)?") {
|
||||||
|
return $_d
|
||||||
|
} else {
|
||||||
|
return $false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $answer
|
||||||
|
}
|
||||||
|
function select-server {
|
||||||
|
# Build server menu
|
||||||
|
$avail_servers = @(gdr | Where-Object {$_.DisplayRoot -imatch '\\\\'})
|
||||||
|
if ($avail_servers.count -eq 0) {
|
||||||
|
wk-error "No suitable backup servers were detected."
|
||||||
|
return $false
|
||||||
|
}
|
||||||
|
$menu_imaging_server = "Where are we saving the backup image(s)?`r`n`r`n"
|
||||||
|
$valid_answers = @("M", "m")
|
||||||
|
for ($i=0; $i -lt $avail_servers.length; $i++) {
|
||||||
|
$valid_answers += ($i + 1)
|
||||||
|
$menu_imaging_server += ("{0}: {1} ({2:N2} Gb free)`r`n" -f ($i + 1), $avail_servers[$i].Description, ($avail_servers[$i].Free / 1Gb))
|
||||||
|
}
|
||||||
|
$menu_imaging_server += "`r`n"
|
||||||
|
$menu_imaging_server += "M: Main Menu`r`n"
|
||||||
|
$menu_imaging_server += "`r`n"
|
||||||
|
$menu_imaging_server += "Please make a selection`r`n"
|
||||||
|
|
||||||
|
# Select server
|
||||||
|
do {
|
||||||
|
# clear
|
||||||
|
$answer = read-host -prompt $menu_imaging_server
|
||||||
|
} until ($valid_answers -contains $answer)
|
||||||
|
|
||||||
|
if ($answer -imatch '^\d+$') {
|
||||||
|
$answer -= 1
|
||||||
|
return $avail_servers[$answer]
|
||||||
|
}
|
||||||
|
return $answer
|
||||||
|
}
|
||||||
function wk-exit {
|
function wk-exit {
|
||||||
popd
|
popd
|
||||||
if ($answer -match 'R') {
|
if ($answer -match 'R') {
|
||||||
|
|
@ -154,35 +268,37 @@ function mount-servers {
|
||||||
# Mount servers
|
# Mount servers
|
||||||
wk-write "Connecting to backup server(s)"
|
wk-write "Connecting to backup server(s)"
|
||||||
foreach ($_server in $backup_servers) {
|
foreach ($_server in $backup_servers) {
|
||||||
if (test-connection $_server.ip -count 1 -quiet 2>&1 | out-null) {
|
if (test-connection $_server.ip -count 3 -quiet) {
|
||||||
try {
|
try {
|
||||||
$_path = "\\{0}\{1}" -f $_server.ip, $_server.path
|
$_path = "\\{0}\{1}" -f $_server.ip, $_server.path
|
||||||
$_drive = "{0}:" -f $_server.letter
|
$_drive = "{0}:" -f $_server.letter
|
||||||
net use $_drive "$_path" /user:$backup_user $backup_pass | out-null
|
net use $_drive "$_path" /user:$backup_user $backup_pass | Out-Null
|
||||||
wk-write ("`t{0} server: mounted" -f $_server.name)
|
wk-write ("`t{0} server: mounted" -f $_server.name)
|
||||||
|
|
||||||
# Add friendly description
|
# Add friendly description
|
||||||
$_regex = "^{0}$" -f $_server.letter
|
$_regex = "^{0}$" -f $_server.letter
|
||||||
(gdr | where {$_.Name -imatch $_regex}).Description = $_server.name
|
(gdr | Where-Object {$_.Name -imatch $_regex}).Description = $_server.name
|
||||||
} catch {
|
} catch {
|
||||||
wk-warn ("`t{0} server: failed" -f $_server.name)
|
wk-warn ("`t{0} server: failed" -f $_server.name)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
wk-warn ("`t{0} server: unreachable" -f $_server.name)
|
wk-warn ("`t{0} server: timed-out" -f $_server.name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function unmount-servers {
|
function unmount-servers {
|
||||||
# Unmount servers
|
# Unmount servers
|
||||||
wk-write "Disconnecting from backup server(s)"
|
wk-write "Disconnecting from backup server(s)"
|
||||||
$mounted_servers = @(gdr | where {$_.DisplayRoot -imatch '\\\\'})
|
$mounted_servers = @(gdr | Where-Object {$_.DisplayRoot -imatch '\\\\'})
|
||||||
foreach ($_server in $mounted_servers) {
|
foreach ($_server in $mounted_servers) {
|
||||||
try {
|
try {
|
||||||
$_drive = "{0}:" -f $_server.Name
|
$_drive = "{0}:" -f $_server.Name
|
||||||
net use $_drive /delete | out-null
|
net use $_drive /delete | Out-Null
|
||||||
wk-warn ("`t{0} server: unmounted" -f $_server.name)
|
#wk-warn ("`t{0} server: unmounted" -f $_server.name)
|
||||||
|
wk-warn "`tServer: unmounted"
|
||||||
} catch {
|
} catch {
|
||||||
wk-warn ("`t{0} server: failed" -f $_server.name)
|
#wk-warn ("`t{0} server: failed" -f $_server.name)
|
||||||
|
wk-warn "`tServer: failed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -194,86 +310,92 @@ function menu-imaging {
|
||||||
wk-warn "WARNING: This section is experimental"
|
wk-warn "WARNING: This section is experimental"
|
||||||
pause
|
pause
|
||||||
## WARNING
|
## WARNING
|
||||||
|
|
||||||
# Check if any source drives were detected
|
# Service Order
|
||||||
$disks = get-disk | where {$_.Size -ne 0}
|
$menu_service_order += "Please enter the service order`r`n"
|
||||||
# if ($disks.count -eq 0) {
|
do {
|
||||||
# wk-error "No suitable source drives were detected."
|
clear
|
||||||
# pause "Press Enter to return to main menu... " $True
|
$service_order = read-host -prompt $menu_service_order
|
||||||
# return 1
|
} until ($service_order -imatch '^\d[\w\-]+$')
|
||||||
# }
|
|
||||||
|
# Select Disk
|
||||||
|
$disk = select-disk
|
||||||
|
if (!($disk)) {
|
||||||
|
# No drives detected or user aborted
|
||||||
|
wk-warn "Drive Imaging aborted."
|
||||||
|
wk-write ""
|
||||||
|
pause "Press Enter to return to main menu... "
|
||||||
|
return $false
|
||||||
|
} elseif ($disk -imatch '^M$') {
|
||||||
|
# User selected to return to the menu
|
||||||
|
return
|
||||||
|
}
|
||||||
|
wk-write ""
|
||||||
|
|
||||||
# Mount server(s)
|
# Mount server(s)
|
||||||
mount-servers
|
mount-servers
|
||||||
|
|
||||||
# Build server menu
|
# Select Server
|
||||||
$avail_servers = @(gdr | where {$_.DisplayRoot -imatch '\\\\'})
|
$server = select-server
|
||||||
# if ($avail_servers.count -eq 0) {
|
if (!($server)) {
|
||||||
# wk-error "No suitable backup servers were detected."
|
# No servers detected
|
||||||
# pause "Press Enter to return to main menu... " $True
|
wk-warn "Drive Imaging aborted."
|
||||||
# return 1
|
wk-write ""
|
||||||
# }
|
pause "Press Enter to return to main menu... "
|
||||||
$menu_imaging_server = "Where are we saving the backup image(s)?`r`n`r`n"
|
return $false
|
||||||
$valid_answers = @("M", "m")
|
} elseif ($server -imatch '^M$') {
|
||||||
for ($i=0; $i -lt $avail_servers.length; $i++) {
|
# User selected to return to the menu
|
||||||
$valid_answers += ($i + 1)
|
|
||||||
$menu_imaging_server += ("{0}: {1} ({2:N2} Gb free)`r`n" -f ($i + 1), $avail_servers[$i].Description, ($avail_servers[$i].Free / 1Gb))
|
|
||||||
}
|
|
||||||
$menu_imaging_server += "`r`n"
|
|
||||||
$menu_imaging_server += "M: Main Menu`r`n"
|
|
||||||
$menu_imaging_server += "`r`n"
|
|
||||||
$menu_imaging_server += "Please make a selection`r`n"
|
|
||||||
|
|
||||||
# Select server
|
|
||||||
do {
|
|
||||||
##testing## clear
|
|
||||||
$answer = read-host -prompt $menu_imaging_server
|
|
||||||
} until ($valid_answers -contains $answer)
|
|
||||||
if ($answer -imatch '^M$') {
|
|
||||||
# Exit if requested
|
|
||||||
unmount-servers
|
|
||||||
return
|
return
|
||||||
} else {
|
|
||||||
$answer -= 1
|
|
||||||
$dest_backup_server = $avail_servers[$answer]
|
|
||||||
}
|
}
|
||||||
|
wk-write ""
|
||||||
# Build source menu
|
wk-write ("Saving partition backups to: {0}" -f $server.Description)
|
||||||
$menu_imaging_source = "For which drive are we creating backup image(s)?`r`n`r`n"
|
wk-write ""
|
||||||
$valid_answers = @("M", "m")
|
|
||||||
foreach ($_ in $disks) {
|
|
||||||
$valid_answers += $_.DiskNumber
|
|
||||||
$menu_imaging_source += "{0}: {1:N0} Gb`t({2}) {3} ({4})`r`n" -f $_.DiskNumber, ($_.Size / 1GB), $_.BusType, $_.FriendlyName, $_.PartitionStyle
|
|
||||||
}
|
|
||||||
$menu_imaging_source += "`r`n"
|
|
||||||
$menu_imaging_source += "M: Main Menu`r`n"
|
|
||||||
$menu_imaging_source += "`r`n"
|
|
||||||
$menu_imaging_source += "Please make a selection`r`n"
|
|
||||||
|
|
||||||
# Select source
|
|
||||||
do {
|
|
||||||
##testing## clear
|
|
||||||
$answer = read-host -prompt $menu_imaging_source
|
|
||||||
} until ($valid_answers -contains $answer)
|
|
||||||
|
|
||||||
if ($answer -imatch '^M$') {
|
|
||||||
# Exit if requested
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
##TODO##
|
|
||||||
get-volume
|
|
||||||
}
|
|
||||||
|
|
||||||
# Service Order
|
|
||||||
$menu_service_order += "Please enter the service order`r`n"
|
|
||||||
do {
|
|
||||||
##testing## clear
|
|
||||||
$service_order = read-host -prompt $menu_service_order
|
|
||||||
} until ($service_order -imatch '^\d[\w\-]+$')
|
|
||||||
|
|
||||||
# Backup partitions
|
# Backup partitions
|
||||||
wk-write ("Saving partition backups to: {0}" -f $dest_backup_server.Description)
|
$partitions = Get-Partition -DiskNumber $disk.DiskNumber
|
||||||
wk-write ("`t{0}{1}" -f $dest_backup_server.Root, $service_order)
|
foreach ($_p in $partitions) {
|
||||||
|
$_v = Get-Volume -Partition $_p
|
||||||
|
|
||||||
|
$_name = "{0}" -f $_p.PartitionNumber
|
||||||
|
if ($_v -and $_v.FileSystemLabel -ne "") {
|
||||||
|
$_name += "_{0}" -f $_v.FileSystemLabel
|
||||||
|
} else {
|
||||||
|
$_name += "_{0}" -f $_p.Type
|
||||||
|
}
|
||||||
|
|
||||||
|
$_imagepath = "{0}{1}" -f $server.Root, $service_order
|
||||||
|
$_imagefile = "{0}{1}\{2}.wim" -f $server.Root, $service_order, $_name
|
||||||
|
|
||||||
|
if ($_p.AccessPaths -ne $null) {
|
||||||
|
$_capturepath = $_p.AccessPaths | Where-Object {$_ -imatch '^\w:\\$'}
|
||||||
|
|
||||||
|
# Take image
|
||||||
|
wk-write (" Imaging partition {0} --> `"{1}`"" -f $_p.PartitionNumber, $_imagefile)
|
||||||
|
if (!(Test-Path "$_imagepath")) {
|
||||||
|
mkdir "$_imagepath" | out-null
|
||||||
|
}
|
||||||
|
New-WindowsImage -ImagePath "$_imagefile" -CapturePath "$_capturepath" -Name "$_name" -CompressionType "fast" | out-null
|
||||||
|
|
||||||
|
# Verify image
|
||||||
|
## Code borrowed from: https://stackoverflow/a/10262275
|
||||||
|
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
|
||||||
|
$pinfo.FileName = "$WKPath\7z.exe"
|
||||||
|
$pinfo.RedirectStandardError = $true
|
||||||
|
$pinfo.RedirectStandardOutput = $true
|
||||||
|
$pinfo.UseShellExecute = $false
|
||||||
|
$pinfo.Arguments = 't "{0}"' -f $_imagefile
|
||||||
|
$p = New-Object System.Diagnostics.Process
|
||||||
|
$p.StartInfo = $pinfo
|
||||||
|
$p.Start() | Out-Null
|
||||||
|
write-host " Verifying . . . " -NoNewline
|
||||||
|
$p.WaitForExit()
|
||||||
|
if ($p.ExitCode -eq 0) {
|
||||||
|
write-host "Complete." -foreground "green"
|
||||||
|
} else {
|
||||||
|
write-host "Failed." -foreground "red"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Unmount server(s)
|
# Unmount server(s)
|
||||||
unmount-servers
|
unmount-servers
|
||||||
|
|
@ -284,11 +406,11 @@ function menu-setup {
|
||||||
wk-write ""
|
wk-write ""
|
||||||
|
|
||||||
# Check if any destination drives were detected
|
# Check if any destination drives were detected
|
||||||
$disks = get-disk | where {$_.Size -ne 0 -and $_.BusType -inotmatch 'USB'}
|
$disks = Get-Disk | Where-Object {$_.Size -ne 0 -and $_.BusType -inotmatch 'USB'}
|
||||||
if ($disks.count -eq 0) {
|
if ($disks.count -eq 0) {
|
||||||
wk-error "No suitable destination drives were detected."
|
wk-error "No suitable destination drives were detected."
|
||||||
pause "Press Enter to return to main menu... " $True
|
pause "Press Enter to return to main menu... " $True
|
||||||
return 1
|
return $false
|
||||||
}
|
}
|
||||||
|
|
||||||
# Build windows menu
|
# Build windows menu
|
||||||
|
|
@ -314,7 +436,7 @@ function menu-setup {
|
||||||
|
|
||||||
# Select Windows version
|
# Select Windows version
|
||||||
do {
|
do {
|
||||||
##testing## clear
|
clear
|
||||||
$answer = read-host -prompt $menu_setup_windows
|
$answer = read-host -prompt $menu_setup_windows
|
||||||
} until ($valid_answers -contains $answer)
|
} until ($valid_answers -contains $answer)
|
||||||
|
|
||||||
|
|
@ -340,7 +462,7 @@ function menu-setup {
|
||||||
|
|
||||||
# Select disk
|
# Select disk
|
||||||
do {
|
do {
|
||||||
##testing## clear
|
clear
|
||||||
$answer = read-host -prompt $menu_setup_disk
|
$answer = read-host -prompt $menu_setup_disk
|
||||||
} until ($valid_answers -contains $answer)
|
} until ($valid_answers -contains $answer)
|
||||||
|
|
||||||
|
|
@ -349,7 +471,7 @@ function menu-setup {
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
# Double check before deleting data
|
# Double check before deleting data
|
||||||
$dest_disk = $disks | where {$_.DiskNumber -eq $answer}
|
$dest_disk = $disks | Where-Object {$_.DiskNumber -eq $answer}
|
||||||
wk-warn "All data will be deleted from the following drive:"
|
wk-warn "All data will be deleted from the following drive:"
|
||||||
wk-warn ("`t{0:N0} Gb`t({1}) {2}`r`n" -f ($dest_disk.Size / 1GB), $dest_disk.PartitionStyle, $dest_disk.FriendlyName)
|
wk-warn ("`t{0:N0} Gb`t({1}) {2}`r`n" -f ($dest_disk.Size / 1GB), $dest_disk.PartitionStyle, $dest_disk.FriendlyName)
|
||||||
if (ask ("Proceed and install {0}?" -f $dest_windows_version.Name)) {
|
if (ask ("Proceed and install {0}?" -f $dest_windows_version.Name)) {
|
||||||
|
|
@ -396,7 +518,7 @@ function menu-setup {
|
||||||
wk-error "Windows Setup aborted."
|
wk-error "Windows Setup aborted."
|
||||||
wk-write ""
|
wk-write ""
|
||||||
pause "Press Enter to return to main menu... "
|
pause "Press Enter to return to main menu... "
|
||||||
return 1
|
return $false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
wk-error "Windows Setup aborted."
|
wk-error "Windows Setup aborted."
|
||||||
|
|
@ -414,7 +536,7 @@ function menu-tools {
|
||||||
wk-write "Misc Tools"
|
wk-write "Misc Tools"
|
||||||
wk-write ""
|
wk-write ""
|
||||||
wk-warn "Be careful."
|
wk-warn "Be careful."
|
||||||
start "$WKPath\explorer++" -argumentlist @("$WKPath")
|
Start-Process "$WKPath\explorer++" -argumentlist @("$WKPath")
|
||||||
wk-exit
|
wk-exit
|
||||||
}
|
}
|
||||||
function menu-main {
|
function menu-main {
|
||||||
|
|
@ -434,10 +556,10 @@ Please make a selection
|
||||||
"@
|
"@
|
||||||
|
|
||||||
do {
|
do {
|
||||||
##testing## clear
|
clear
|
||||||
$answer = read-host -prompt $menu_main
|
$answer = read-host -prompt $menu_main
|
||||||
} until ($answer -imatch '^[123QRS]$')
|
} until ($answer -imatch '^[123QRS]$')
|
||||||
##testing## clear
|
clear
|
||||||
|
|
||||||
if ($answer.GetType().Name -match "String") {
|
if ($answer.GetType().Name -match "String") {
|
||||||
$answer = $answer.ToUpper()
|
$answer = $answer.ToUpper()
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,21 @@ function wk-write {
|
||||||
write-host ($text)
|
write-host ($text)
|
||||||
out-file -filepath $log -inputobject $text -append
|
out-file -filepath $log -inputobject $text -append
|
||||||
}
|
}
|
||||||
|
function human-size {
|
||||||
|
param($bytes, [int]$decimals = 2)
|
||||||
|
if ($bytes -gt 1Tb) {
|
||||||
|
$size = "{0:N$decimals} Tb" -f ($bytes / 1Tb)
|
||||||
|
} elseif ($bytes -gt 1Gb) {
|
||||||
|
$size = "{0:N$decimals} Gb" -f ($bytes / 1Gb)
|
||||||
|
} elseif ($bytes -gt 1Mb) {
|
||||||
|
$size = "{0:N$decimals} Mb" -f ($bytes / 1Mb)
|
||||||
|
} elseif ($bytes -gt 1Kb) {
|
||||||
|
$size = "{0:N$decimals} Kb" -f ($bytes / 1Kb)
|
||||||
|
} else {
|
||||||
|
$size = "{0:N$decimals} b" -f $bytes
|
||||||
|
}
|
||||||
|
return $size
|
||||||
|
}
|
||||||
function pause {
|
function pause {
|
||||||
param([string]$message = "Press Enter to continue... ", [bool]$warning = $False)
|
param([string]$message = "Press Enter to continue... ", [bool]$warning = $False)
|
||||||
if ($warning) {
|
if ($warning) {
|
||||||
|
|
|
||||||
16
make.cmd
16
make.cmd
|
|
@ -50,6 +50,14 @@ dism /add-package /image:"%wd%\mount" /packagepath:"%winpe_ocs%\en-us\WinPE-Dism
|
||||||
:: Install WinPE-WMI > WinPE-NetFX > WinPE-Scripting > WinPE-PowerShell before you install WinPE-SecureBootCmdlets.
|
:: Install WinPE-WMI > WinPE-NetFX > WinPE-Scripting > WinPE-PowerShell before you install WinPE-SecureBootCmdlets.
|
||||||
dism /add-package /image:"%wd%\mount" /packagepath:"%winpe_ocs%\WinPE-SecureBootCmdlets.cab" /logpath:"dism.log"
|
dism /add-package /image:"%wd%\mount" /packagepath:"%winpe_ocs%\WinPE-SecureBootCmdlets.cab" /logpath:"dism.log"
|
||||||
|
|
||||||
|
:: Install WinPE-WMI > WinPE-NetFX > WinPE-Scripting > WinPE-PowerShell before you install WinPE-StorageWMI.
|
||||||
|
dism /add-package /image:"%wd%\mount" /packagepath:"%winpe_ocs%\WinPE-StorageWMI.cab" /logpath:"dism.log"
|
||||||
|
dism /add-package /image:"%wd%\mount" /packagepath:"%winpe_ocs%\en-us\WinPE-StorageWMI_en-us.cab" /logpath:"dism.log"
|
||||||
|
|
||||||
|
:: Install ?? before you install WinPE-EnhancedStorage.
|
||||||
|
dism /add-package /image:"%wd%\mount" /packagepath:"%winpe_ocs%\WinPE-EnhancedStorage.cab" /logpath:"dism.log"
|
||||||
|
dism /add-package /image:"%wd%\mount" /packagepath:"%winpe_ocs%\en-us\WinPE-EnhancedStorage_en-us.cab" /logpath:"dism.log"
|
||||||
|
|
||||||
:Robocopy
|
:Robocopy
|
||||||
del "%wd%\WK\Scripts\WK.log"
|
del "%wd%\WK\Scripts\WK.log"
|
||||||
mkdir "%wd%\mount\WK"
|
mkdir "%wd%\mount\WK"
|
||||||
|
|
@ -78,12 +86,16 @@ echo.
|
||||||
echo Press any key to commit changes...
|
echo Press any key to commit changes...
|
||||||
pause>nul
|
pause>nul
|
||||||
|
|
||||||
|
:Set-ScratchSpace
|
||||||
|
rem Force RamDisk size to try and avoid capture-image errors
|
||||||
|
dism /image:"%wd%\mount" /set-scratchspace:512
|
||||||
|
|
||||||
:Unmount
|
:Unmount
|
||||||
dism /unmount-image /mountdir:"%wd%\mount" /commit
|
dism /unmount-image /mountdir:"%wd%\mount" /commit
|
||||||
|
|
||||||
:CreateISO
|
:CreateISO
|
||||||
del winpe10-test.iso
|
del winpe10-2016.iso
|
||||||
makewinpemedia.cmd /iso "%wd%\pe_files" winpe10-test.iso
|
makewinpemedia.cmd /iso "%wd%\pe_files" winpe10-2016.iso
|
||||||
goto Done
|
goto Done
|
||||||
|
|
||||||
:Abort
|
:Abort
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue