Add this script to your custom WinPE boot media to make grabbing the logs from a system simple and quick.
UPDATED 9/11/2016 – https://github.com/brianfgonzalez/Scripts/blob/master/CollectLogs.ps1
<# Version: 1.1 ChangeLog: - September 10, 2015 : First revision of script. - Moved function code above function call. 1.1 - Switched to using [System.IO.DriveInfo]::getdrives() instead of gwmi #> function fReRunPrompt{ $sRet = [Microsoft.VisualBasic.Interaction]::MsgBox("Would you like to rerun the script?",'YesNo,Question', "Rerun script prompt") If ($sRet -eq "Yes") { fMain } } function fMain { #$ErrorActionPreference = "SilentlyContinue" #trap {"Error found: $_" | Out-File "F:\CollectLogs.log"} # Locate USB media drive letter ####################################################################################################################################################### try { $oAllUSBDrive = ([System.IO.DriveInfo]::getdrives() | ?{ $_.DriveType -eq "Removable"} | Sort-Object -Descending TotalSize)[0] if ($oAllUSBDrive -eq $null) { $oAllUSBDrive = ([System.IO.DriveInfo]::getdrives() | ?{ $_.DriveType -eq "Removable"} | Sort-Object -Descending TotalSize) } $sUSBDriveLetter = $oAllUSBDrive.Name } catch { [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") | Out-Null [Microsoft.VisualBasic.Interaction]::MsgBox("An error occurred when attempting to locate USB drive.",'OKOnly,Exclamation', "Error encountered") | Out-Null fReRunPrompt Exit } # Locate Local HDD drive letter (100GB+) ####################################################################################################################################################### try { $oLocalLargestHDD = ([System.IO.DriveInfo]::getdrives() | ?{ $_.DriveType -eq "Fixed"} | Sort-Object -Descending TotalSize)[0] If ($oLocalLargestHDD.TotalSize -gt 100000000) { $sHDDDriveLetter = $oLocalLargestHDD.Name } else { [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") | Out-Null [Microsoft.VisualBasic.Interaction]::MsgBox("HDD is NOT 100GB, so there is no SYSTEM partition!",'OKOnly,Exclamation', "Error encountered") | Out-Null fReRunPrompt Exit } } catch { [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") | Out-Null [Microsoft.VisualBasic.Interaction]::MsgBox("An error occurred when attempting to locate a HDD drive.",'OKOnly,Exclamation', "Error encountered") | Out-Null fReRunPrompt Exit } # Create folder on USB media named with DATE and TIME stamp information ####################################################################################################################################################### $sDateFormat = (Get-Date -format "yyyy-M-d_HHmm") $sLogFolderPath = "{0}{1}" -f $sUSBDriveLetter, $sDateFormat New-Item -type Directory -path $sLogFolderPath -force # Copy all Windows or Deployment related log files on local HDD try { $oLocalLargestHDD = ([System.IO.DriveInfo]::getdrives() | ?{ $_.DriveType -eq "Fixed"} | Sort-Object -Descending TotalSize)[0] If ($oLocalLargestHDD.TotalSize -gt 100000000) { $sHDDDriveLetter = $oLocalLargestHDD.Name } else { [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") | Out-Null [Microsoft.VisualBasic.Interaction]::MsgBox("HDD is NOT 100GB, so there is no SYSTEM partition!",'OKOnly,Exclamation', "Error encountered") | Out-Null fReRunPrompt Exit } } catch { [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") | Out-Null [Microsoft.VisualBasic.Interaction]::MsgBox("An error occurred when attempting to locate a HDD drive.",'OKOnly,Exclamation', "Error encountered") | Out-Null fReRunPrompt Exit } # Copy log files into created Directory on USB drive ####################################################################################################################################################### # Function to reuse search and copy function fSearchAndCopy($aDirectories) { $sInt=0 foreach ($sDirectory in $aDirectories) { $sDirectory = "{0}{1}" -f $sHDDDriveLetter, $sDirectory $sMsg = "Copying {0}" -f $sDirectory Write-Host $sMsg if ((Test-Path $sDirectory) -eq $true) { $sInt = $sInt + 1 $sDestinationDirectory = "$sLogFolderPath\$sInt" Write-Host $sDirectory New-Item -type Directory -path "$sDestinationDirectory" -force Copy-Item -Path "$sDirectory\*" -Destination "$sDestinationDirectory" -Force -Recurse Add-Content "$sDestinationDirectory\OriginalDirectory.txt" $sDirectory } } } # Populate Directories Array $aDirectories = @("Windows\Temp\DeploymentLogs", "MININT\SMSOSD\OSDLOGS", "Windows\System32\sysprep\Panther", "Windows\Panther", "_SMSTaskSequence", "SMSTSLog") #Initiate folder copy routine try { fSearchAndCopy($aDirectories) [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") | Out-Null [Microsoft.VisualBasic.Interaction]::MsgBox("Copy of content is complete. Shutting down unit.",'OKOnly,Information', "Error encountered") | Out-Null } catch { [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") | Out-Null [Microsoft.VisualBasic.Interaction]::MsgBox("Error occured during the copy of the deployment files.",'OKOnly,Exclamation', "Error encountered") | Out-Null fReRunPrompt Exit } Start-Process "x:\windows\system32\wpeutil.exe" @('"shutdown"') } # Call fMain fMain