question

JeremyHarris-9734 avatar image
0 Votes"
JeremyHarris-9734 asked DSPatrick answered

Can anyone help me upgrade my windows 10 Version 1909 to Version 20H2?

My computer refuses to install Version 20H2 feature update from Version 1909. It comes up with an error after apparently installing which is to do with "BOOT_SAFE" phase(?). Any help would be appreciated. By the way, I've gone through all the drivers in Device Manager & checked they're all up-to-date. I've tried to install this feature update many times already without success & it's starting to drive me nuts as I can't afford to replace my PC if I can't get this update in.

windows-10-general
· 1
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

How are you performing the upgrade?
Are you booting from the installer file or did you run the setup inside the Windows 10?

0 Votes 0 ·
DSPatrick avatar image
0 Votes"
DSPatrick answered

Just checking if there's any progress or updates?

--please don't forget to Accept as answer if the reply is helpful--






5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

SumitDhiman avatar image
0 Votes"
SumitDhiman answered

Let us check the Installation log to find why the update failed. Please share the logs as mentioned in this article. You should use a File sharing service like Onedrive or Media Fire to upload files and share the link in the next reply.

https://answers.microsoft.com/en-us/windows/forum/all/troubleshoot-feature-update-install-failures/eaf4ff24-64d6-4c72-824c-3ba3df716fc3

The Panther logs. Files named Setupact.log and Setuperr.log from the following path C:\$Windows.~BT\Sources\Panther

The Rollback logs: These usually are created if Windows Update rolls back. Files named Setupact.log and Setuperr.log from the following path C:\$Windows.~BT\Sources\Rollback

[Only if the error code is 0xC1900101-0x30018] The Device Install Log from C:/$Windows.~bt\Sources\Rollback\setupapi\setupapi.dev.log

You can open the folder directly by pasting the path in Run dialog box.

As the log size might be large consider zipping before uploading.

5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Docs-4663 avatar image
0 Votes"
Docs-4663 answered

UPGRADE CHECK LIST:
Run through this check list before the next upgrade attempt:

1) remove nonessential hardware
docks
USB devices
printers
headset
speakers
joysticks
projectors
scanners
plotters
portable optical drives (CD, DVD)
microphones
cameras
webcams
smartphones
bluetooth devices
USB drives (other than a windows 10 iso if used for the upgrade)
USB Wireless Mouse or Keyboard Receiver, USB Wireless Network Card
secondary monitors


2) These should be the only attached devices:
wired mouse
wired keyboard
monitor

Any of these that have been done in the past week are not necessary to repeat:


3) open administrative command prompt and type or copy and paste: (repair file system)
chkdsk /r /v
This may take many hours so plan to run overnight
Find the chkdsk report in the event viewer using the information in this link and post into the thread:
Read Chkdsk Log in Event Viewer in Windows 10 Performance Maintenance Tutorials
https://www.tenforums.com/tutorials/40822-read-chkdsk-log-event-viewer-windows-10-a.html

4) open administrative command prompt and copy and paste: (repair operating system)
sfc /scannow
dism /online /cleanup-image /restorehealth
When these have completed > right click on the top bar or title bar of the administrative command prompt box > left click
on edit then select all > right click on the top bar again > left click on edit then copy > paste into the thread

5) update windows (have all recommended updates installed) and reboot after updates

6) List and uninstall all non-Microsoft antivirus software
(This includes always on and manual software.)
(This includes running the applicable antivirus uninstall tools for any AV that could have been incompletely uninstalled)
https://www.bitdefender.com/consumer/support/answer/2625/

7) List and uninstall all non-Microsoft firewall software

8) List all Microsoft and non-Microsoft drive encryption software.
Uninstall all non-Microsoft disk encryption software

9) Run disk cleanup to clean temporary and system files

10) Verify that the drive has > 32 GB free space

11) Place the computer in clean boot:
https://support.microsoft.com/en-us/help/929135/how-to-perform-a-clean-boot-in-windows
How to perform a Clean Boot in Windows 10 - TechNet Articles - United States (English) - TechNet Wiki
https://social.technet.microsoft.com/wiki/contents/articles/29876.how-to-perform-a-clean-boot-in-windows-10.aspx
https://www.tenforums.com/tutorials/41804-perform-clean-boot-windows-10-troubleshoot-software-conflicts.html


12) Test the drive: (Sea Tools long generic and Crystal Disk SMART)
https://www.sevenforums.com/tutorials/313457-seatools-dos-windows-how-use.html
https://www.seagate.com/support/downloads/seatools/seatools-win-master/
Crystal Disk standard edition:
https://crystalmark.info/en/software/crystaldiskinfo/


13) Detach all SATA devices other than the disk drive that has the Windows operating system
(Make sure that the only disk drive that is attached to the computer at the time of the upgrade attempt
is the disk drive containing Windows)
(Other disk drives may be able to be detached by disconnecting cables or if necessary to remove the drive
from the computer)

14) Make sure that there is no metered connection:
https://support.microsoft.com/en-us/help/17452/windows-metered-internet-connections-faq




Most likely the log files need troubleshooting > see earlier post with PS script



.
.
.
.
.

Please remember to vote and to mark the replies as answers if they help.
.
.
.
.
.
.
.

5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

DSPatrick avatar image
0 Votes"
DSPatrick answered JeremyHarris-9734 published

Just checking if there's any progress or updates?

--please don't forget to Accept as answer if the reply is helpful--




· 1
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

I have tried to upgrade using the Update Assistant. NO GOOD, it didn't work. I have previously tried through Windows Update & MediaCreationTool20H2 as well, but again, NO GOOD. I've been told to try using an ISO file, but I have no idea what they're talking about or how to create & use one.
Someone also sent me a load of code (1000 lines of it in total), but again, I don't know how to use & utilize that media.
I can only use what I understand already, I'm 53, quite brainy , but some of what everyone is telling me makes no sense or feels like complete Gobble-dee-gook, which confuses me even more.
What I need from you experts is plain english answers that I can confidently follow step-by-step

0 Votes 0 ·
Docs-4663 avatar image
0 Votes"
Docs-4663 answered

Open administrative Power Shell (PS) and copy and paste this script > click OK > post a share link using one drive, drop box, or google drive:

 function wh   
     {  
         Param ( [parameter (Mandatory = $true)][string]$txt )  
         Write-Host $txt -ForegroundColor Green -BackgroundColor Black -NoNewline  
         ##Example usage wh "Alias for `n Write-Host"  
      
     } ## End function wh  
      
      
 function StartScript   
     {  
         ##Locating Temp Dir and writing Transcript  
         $global:tempDir = [System.IO.Path]::GetTempPath()   
         MD $tempDir\LOGS -EA SilentlyContinue   
         CD $tempDir\LOGS  
         $txtCount = Get-Item $tempDir/LOGS/*.TXT -EA SilentlyContinue  
         if((Get-Host).Version.Major -cge 5) ##WIN7 Not Supported  
             {  
                 if($txtCount.Count -cge 1)   
                 {Start-Transcript -Append -Path $tempDir/LOGS/Event-Search.TXT}   
                 Else{Start-Transcript -Path $tempDir\LOGS\Event-Search.TXT}   
             }  
      
         $global:explore = $tempDir + "LOGS\"  
         $global:Ver = "1.6.3"  
         wh "`nLog Collection... (V$Ver)`n"  
      
         #clearing previous actions  
         Stop-Job *  
      
         #Initialize CheckBox Vars to $True/$False  
             $Global:EventsCollect = $true; $Global:SetupDiagCollect = $true  
                 $Global:UpdatesCollect = $true; $Global:WLANCollect = $true  
                     $Global:PowerCollect = $true; $Global:GPCollect = $true  
                         $Global:miscCollect = $true; $Global:bingCollect = $true  
                             $Global:eventOut = $false        
         #Clear Jobs  
         Stop-Job *  
         Remove-Job *  
                                              
     } ## End function Start-Script  
      
      
 function SetupDiagFunc  
     {  
         wh "`n Grabbing SetupDiag.exe ..."       
         Invoke-WebRequest https://go.microsoft.com/fwlink/?linkid=870142 -OutFile $tempDir\SetupDiag.exe -TimeoutSec 3 -UseBasicParsing  
             #check for successful download  
             if((Get-Item $tempDir\SetupDiag.exe).length -gt 100000)  
                 {  
                   wh "`nSuccessful DL!"  
                   wh "`n Invoking SetupDiag.exe ..."  
                   $SetupDiag = {CMD.EXE /C "%temp%\setupdiag.exe /Verbose /Output:%temp%\SetupDiag-Log.txt"}  
      
                   ## Kick-Off SetupDiagJob  
                   Start-Job -Name SetupDiagJob -ScriptBlock $SetupDiag                     
                      
                 }Else{Write-Host "`nDownload of SetupDiag.exe Failed!" -BackgroundColor RED }  
      
     } ## End Function SetupDiagFunc  
      
      
 function EventSearch  
     {  
     wh "`n Starting EventSearch Job-Function ...`n"  
     ## Gathering Events from System using Get-WinEvent via Job  
     $EventSearchJob =   
         {  
         $evtPaths = Get-Item C:\Windows\System32\Winevt\Logs\*.evtx -Exclude "*PowerShell*",   
             "*known folders*" | Select-Object FullName  
         $i = $evtPaths.Count  
      
         $x = 0 ##For 1st Loop do Until x = i  
         $events = @()  
         $gatherEvents = @()  
         $eventsArray = @()  
         $searchResult = @()  
         $MaxEvents = 99  
      
         #Loading/Gathering Events Loop...  
         do {  
           
             ##Getting Events w/ Get-WinEvent         
             $gatherEvents = Get-WinEvent -Path $evtPaths[$x].FullName -MaxEvents $MaxEvents -EA SilentlyContinue  
             $events = $events + $gatherEvents             
      
             $x++  
                  
             }  
              Until ($x -eq $i)      
      
         $x = $x +1 ##Total Events Found!  
              
         $eventsLength = $events.Length ##Total events catalogged!  
              
         $xx = 0  
                   
         # Write Event Properties to a row and roll it out - Collapsing Array ...   
         do {  
                $date = $events[$xx].TimeCreated | Get-Date -Format "yyyyMMdd".ToString() -EA SilentlyContinue ##EA SC for Blank Entries  
                      
                 $eventRow = new-object PSObject -Property @{  
                 Date = $date;  
                 Id = $events[$xx].Id;  
                 Level = $events[$xx].LevelDisplayName;  
                 Provider = $events[$xx].ProviderName;  
                Message = $events[$xx].Message;  
                 }  
      
                 $cRow = $date + " " + "ID:" +  $events[$xx].Id + " " + "Level:" + $events[$xx].LevelDisplayName + " " + "Provider:" + $events[$xx].ProviderName + " " + "Message:" + $events[$xx].Message   
                 $eventsArray += $cRow  
                   
                 $xx++  
                 $d++  
         }  
         Until ($xx -eq $events.Length)  
     
         ##Looking for patterns error or fail in $eventsArray  
         $search = $eventsArray | Select-String -pattern ("error|fail") 
     
         Return $search ## | Write-Output ##Output for job  
      
         } ## End $EventSearchJob  
      
     Start-Job -Name EventSearchJob -ScriptBlock $EventSearchJob  
      
     } ## End function Event-Search  
      
      
 function writeSearch  ##   
     {  
         ##Event Logs Cont.  
         MD $tempDir\LOGS\EVTX\ -EA SilentlyContinue 
     
         ##output to file  
         $search | Group-Object | Sort-Object Count -Descending | Format-Table Count, Name -Wrap > TOP-ERRORS.TXT  
         $search > $tempDir\LOGS\SEARCH.TXT  
      
     if($Global:eventOut -eq $True)  
         {  
         $search | Group-Object | Sort-Object Count -Descending |   
             Select-Object -Property Count, Name | Out-GridView -Title "Top `"Errors`" via EVTX - V-$Ver"  
         }  
      
         wh "`n Collecting Matching EVTX Entries ...`n"     
         #Collecting all prev matching EVTX  
         #$evtx = Get-ChildItem C:\Windows\System32\Winevt\Logs\*.evtx  
         $evv = 0  
                      
            $providerName =   
                (($search | Select-String "Provider:.*Message:").Matches.Value -Replace   
                       " Message:", "" -Replace "Provider:", "" | Group-Object ).Name  
                  
             #Converting Provider Name to Log Name                 
             $providerName = (($providerName | ForEach-Object {Get-WinEvent -ProviderName $_ -MaxEvents 1 -EA SilentlyContinue}).LogName | Group-Object).Name     
                $providerName = $providerName -replace "Microsoft.", ""  
                   $providerName = $providerName -replace "Windows.", ""  
                      $providerName = $providerName -replace "`/.*$", ""  
                               
                               
                          $evtx = $providerName | foreach{Get-ChildItem "C:\Windows\System32\winevt\logs\*$_*"}  
      
                 Do{  
                     COPY $evtx[$evv].PSPath $tempDir\LOGS\EVTX\ 
                        $evv++  
                   }  
                   Until($evv -eq $evtx.Count)  
      
     } #End function writeSearch  
      
      
 function GetUpdates  
     {  
         wh "`n Starting Get-WindowsUpdateLog Job-Function ...`n"  
         $updateJob = {get-WindowsUpdateLog}  
             
         if((Get-Host).Version.Major -cge 5) ##Modern Gatherer  
         {  
             Start-Job -Name GetUpdates -ScriptBlock $updateJob  
         }  
              
         ##Legacy Gatherer  
         CP C:\Windows\WindowsUpdate.log $tempDir\LOGS\WindowsUpdate.log  
      
         ##Installed-Updates/Packages 
         Get-WmiObject win32_quickfixengineering > $tempDir\LOGS\Installed_Updates.TXT  
         Get-WmiObject Win32_OperatingSystemQFE >> $tempDir\LOGS\Installed_Updates.TXT  
     DISM /Online /Get-Packages /Format:Table >> $tempDir\LOGS\Installed_Updates.TXT 
      
     } ## End function Get-Updates  
      
           
 function PrinterCheck  
     {  
         wh "`n Getting Printer Information ..."  
         get-printer | ft Name, ComputerName, Type, DriverName, PortName, Datatype, Location, DriverName > $tempDir\LOGS\Printers.TXT  
         get-printerDriver | fl >> $tempDir\LOGS\Printers.TXT  
         Get-ChildItem -Recurse Registry::"HKLM\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows NT x86\Drivers" | Out-File $tempDir\LOGS\Printers.TXT -Append  
         Get-ChildItem -Recurse Registry::"HKLM\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows x64\Drivers" | Out-File $tempDir\LOGS\Printers.TXT -Append  
         Get-ChildItem -Recurse Registry::"HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors" | Out-File $tempDir\LOGS\Printers.TXT -Append  
         write-output "## CBS ntprint CHECK ##" >> $tempDir\LOGS\Printers.TXT  
         $cbsCheck = (Get-ChildItem C:\Windows\Logs\CBS\*cbs* -Recurse | select-string -Pattern "E_INVALIDARG in eventsXml.*Microsoft-Windows-PrintService")  
         if($cbsCheck.Count -eq 0){Write-Output "## NO MATCHES IN CBS ##" >> $tempDir\LOGS\Printers.TXT} Else{$cbsCheck | Group-Object  >> $tempDir\LOGS\Printers.TXT}  
         write-output "## ntprint.dll CHECK ##" >> $tempDir\LOGS\Printers.TXT  
         (Get-ChildItem C:\Windows\System32\ntprint.dll).VersionInfo | ft -AutoSize >> $tempDir\LOGS\Printers.TXT  
         (Get-ChildItem C:\Windows\SysWOW64\ntprint.dll).VersionInfo | ft -AutoSize >> $tempDir\LOGS\Printers.TXT  
      
     } ## End function PrinterCheck  
      
      
 function UpdateHelper  
     {  
     if((Get-Host).Version.Major -cge 5)  
         {  
             $winupdatelog = get-item $tempDir\LOGS\windows-update.log    ##WIN-10 File  
             MD $tempDir\LOGS\Windows\Logs\WindowsUpdate\ -EA SilentlyContinue | Out-Null  
             CP C:\Windows\Logs\WindowsUpdate\*.etl $tempDir\LOGS\Windows\Logs\WindowsUpdate\ -EA SilentlyContinue  
         }  
             Else{$winupdatelog = get-item $tempDir\LOGS\windowsupdate.log} ##LEGACY File  
      
     $updateError = ($winupdatelog | select-string -pattern "error.*0x........");  
     $updateErrorSplit = $updateError -Split " "  
     $updateErrorCount = (($updateErrorSplit | select-string -pattern "0x........") -Replace "[(),'`.:]", "" -Replace "hr=", "");  
      
     $updateErrorCount | Group-Object | Sort-Object Count -Descending | Format-Table Count, Name | Out-File $tempDir\LOGS\UPDATE-ERRORS.TXT -Width 999  
     $updateError >> UPDATE-ERRORS.TXT  
     if($updateError.length -eq 0){"No `"error.*0x........`" patterns Found in Windows-Update.log" | Out-File $tempDir\LOGS\UPDATE-ERRORS.TXT}  
      
     ($winupdatelog | Select-String "KB\d\d\d\d\d\d\d" | Select-string "fail") | Out-file $tempDir\LOGS\UPDATE-ERRORS.TXT -Append -width 999  
      
     } ## End function UpdateHelper  
      
      
 function getProcesses  
     {  
     wh "`nGetting Active Process ...`n"   
     Get-Process > $tempDir\LOGS\Running-Processes.TXT  
     CMD.EXE /C "tasklist /svc" | Out-File -Append  $tempDir\LOGS\Running-Processes.TXT  
          
     } ## End function getProcesses  
      
      
 function GetApps  
     {  
     wh "`n Getting List of Installed Apps...`n"  
     Get-WmiObject -Class Win32_Product | Format-Table -Property Name, Version, Vendor > $tempDir\LOGS\Installed-Apps.TXT  
     Get-AppxPackage | ft Name, Version, InstallLocation, IspArtiallyStaged, SignatureKind, Status >> $tempDir\LOGS\Installed-Apps.TXT  
          
     } ## End function GetApps  
      
      
 function SetupLogs  
     {  
     wh "`nGetting Windows Setup Logs Independent of SetupDiage.exe...`n"  
         MD $tempDir\LOGS\SETUP\ -EA SilentlyContinue  
     dir C:\ > $tempDir\LOGS\Dir_Structure.txt  
          
     ## Main Setup Collection  
     if($env:SystemDrive -eq 'C:') ##Verify SystemDrive  
     {  
         $SetupPaths = @()  
      
         $locations = @(  
             'C:\GetCurrent',  
             'C:\$Reset',  
             'C:\$SysReset',  
             'C:\$Windows.~BT',  
             'C:\$Windows.~WS',  
             'C:\Windows\Logs\',  
             'C:\Windows\Panther\',  
             'C:\Windows\inf\',  
             'C:\Windows\System32\LogFiles\',  
             'C:\Windows\System32\SysPrep\',  
             'C:\Windows10Upgrade',  
             'C:\Windows.old\Windows\Panther')  
      
         for($i = 0; $locations.count -gt $i; $i++)  
         {   
             if((get-item $locations[$i] -Force -EA SilentlyContinue).length -gt 0) ##Null Path Check -Force for Hidden  
             {  
                 CD $locations[$i]  
                 ##Search includes setuperr/setupact only  
                 $SetupPaths += Get-ChildItem * -Force -Recurse -Include setuperr.log, setupact.log, miglog.xml, *APPRAISER_Humanreadable.xml -EA SilentlyContinue      
             }  
         }  
      
         $cleanPaths = @()  
      
         for($i = 0; $SetupPaths.count -gt $i; $i++)  
         {  
             $cleanPaths += $SetupPaths[$i].PSParentPath.ToString() -replace "Microsoft\.PowerShell\.Core\\FileSystem\:\:C\:\\", ""  
         }  
      
         CD $tempDir\LOGS\SETUP\  
         MD $cleanPaths -Force  
         CD $tempDir\LOGS\  
      
         for($i = 0; $SetupPaths.count -gt $i; $i++)  
         {  
             $destPath = "$tempDir\LOGS\SETUP\" + $cleanPaths[$i]  
             $copyPathLog = ($SetupPaths[$i].ToString())  
                  
             Copy  $copyPathLog -Destination $destPath  
         }  
          
     }Else{Write-Host "`nSystem Drive is not C:... Setup Collection Aborted!`n"}  
     ## End Main Setup Collection  
          
              
         ## Setup Reg Output      
         Get-ChildItem HKLM:\SYSTEM\SETUP\ | Out-File $tempDir\LOGS\SETUP\HKLM_SYSTEM_SETUP-OOBE.TXT  
         Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE\Me* -recurse -EA SilentlyContinue | Out-File $tempDir\LOGS\SETUP\HKLM_SYSTEM_SETUP-OOBE.TXT -Append  
         Get-Childitem HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate | Out-File $tempDir\LOGS\SETUP\HKLM_SYSTEM_SETUP-OOBE.TXT -Append  
      
         ## SetupAct String Search  
      
      
              
          $setupRegx = @("MOUPG SetupHost..Initialize:",  
                         "============================",  
                         (Get-ChildItem $tempDir\LOGS\*setupact.log -Recurse | Select-String "MOUPG  SetupHost..Initialize. CmdLine"),  
                         "",  
                         "MOUPG Setup build & Host OS Build:",  
                         "==================================",  
                         "",  
                         (Get-ChildItem $tempDir\LOGS\*setupact.log -Recurse | Select-String "MOUPG  SetupHost..Setup build"),  
                         "...",  
                         (Get-ChildItem $tempDir\LOGS\*setupact.log -Recurse | Select-String "MOUPG      Host OS"),  
                         "",  
                         "Watson Parameters (4&5):",  
                         "=======================",  
                         "",  
                         (Get-ChildItem $tempDir\LOGS\*setupact.log -Recurse | Select-String "Watson Bucketing Parameters\[[4-5]\]" ),  
                         "",  
                         "\[0x........\]Error:",  
                         "==================",  
                         "",  
                         (Get-ChildItem $tempDir\LOGS\*setupact.log -Recurse | Select-String "\[0x........\]\[0x.....\]"),  
                         "",  
                         "`"FATAL`":",  
                         "======",  
                         "",  
                         (Get-ChildItem $tempDir\LOGS\*setupact.log -Recurse | Select-String "FATAL" | Select-String -NotMatch "FatalExecutionEngineError" | Select-String -NotMatch "non-fatal"),  
                         "",  
                         "`"Error   `":",  
                         "===========",  
                         "",  
                         (Get-ChildItem $tempDir\LOGS\*setupact.log -Recurse | Select-String "Error   "),  
                         "",  
                         "MIGRATE.*DATA:",  
                         "==============",  
                         "",  
                         (Get-ChildItem $tempDir\LOGS\*setupact.log -Recurse | Select-String "MIGRATE.*DATA"),  
                         ""             
                         )  
             $q=0  
             Do {$setupRegx[$q] | Out-File $tempDir\LOGS\SETUP\SetupAct-Regex.TXT -Append -Width 999 ##spool out results  
                                   $q++                    
                                             }Until($q -eq $setupRegx.Count)  
      
     } ## End function SetupLogs  
      
      
 function powerCFGInfo  
     {  
     MD $tempDir\LOGS\POWER\ -EA SilentlyContinue  | Out-Null  
     wh "`n Grabbing PowerCFG, Sleep & Battery Info ...`n"  
          
     ("`n" + "Available Sleep States (/A): `r" + "`n" +"============================`r" + "`r").ToString() | Out-File -Encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
     powercfg /a | Out-File -Append -encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
      
     ("`n" + "-DeviceQuery Wake_Armed: `r" + "`n" +"========================`r" + "`r").ToString() | Out-File -Append -Encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
     powercfg -devicequery wake_armed  | Out-file -Append -encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
      
     ("`n" + "Last Wake (-lastwake):  `r" + "`n" +"=====================`r" + "`r").ToString() | Out-File -Append -Encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
     powercfg -lastwake  | Out-file -Append -encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
     ("`n`r").ToString() | Out-File -Append -Encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
      
     ("`n" + "-Requests: `r" + "`n" +"==========`r" + "`r").ToString() | Out-File -Append -Encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
     powercfg -requests  | Out-file -Append -encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
      
     $powerList = powercfg -list  
     $powerList | Out-File -Append -encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
     $powerActive = $powerList | select-string "\*" | powercfg /QH "$_"   
     ("`n`r").ToString() | Out-File -Append -Encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
      
     ("`n" + "Active Power Scheme Details: `r" + "`n" +"============================`r" + "`r").ToString() | Out-File -Append -Encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
     $powerActive | Out-File -Append -encoding ascii $tempDir\LOGS\POWER\POWERCFG_INFO.txt  
      
      
     if((Get-Host).Version.Major -cge 5) ##WIN7 Does not Support powercfg /battery /sleepstudy  
          {   
            $ifbattery = Get-WmiObject win32_battery  
            if ( $ifbattery.__SERVER.count -cge 1 ) { CMD.EXE /C "powercfg /batteryreport /output %temp%\LOGS\POWER\battery-report.html" }  
            CMD.EXE /C "powercfg /sleepstudy /output %temp%\LOGS\POWER\sleepstudy-report.html"  
          }  
            CMD.EXE /C "powercfg /ENERGY /duration 10 /output %temp%\LOGS\POWER\energy-report.html"         
          
     } ## End function powerCFGInfo  
      
      
 function sysProductCheck  
     {  
     wh "`n Getting SystemProductName ...`n"  
     ##SystemInformation Reg   
     reg query HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SystemInformation\ /v SystemProductName  > $tempDir\LOGS\REG_SystemProductName.TXT   
     Get-WmiObject Win32_ComputerSystem > $tempDir\LOGS\WMI_Object_System.TXT  
     Get-WmiObject Win32_ComputerSystemProduct >> $tempDir\LOGS\WMI_Object_System.TXT  
          
     } ## End functions sysProductCheck  
      
      
 function showWLAN  
     {  
     wh "Generating NETSH WLAN Report...`n"  
      
     $showWLANjob = {  
                     CMD.EXE /c "netsh wlan show networks mode=ssid > %temp%\LOGS\Network\wlan.txt"  
                     CMD.EXE /c "netsh wlan show networks mode=bssid >> %temp%\LOGS\Network\wlan.txt"  
                     CMD.EXE /c "netsh winhttp show proxy > %temp%\LOGS\Network\proxy.txt"  
                     CMD.EXE /c "netsh wlan show wlanreport & COPY C:\ProgramData\Microsoft\Windows\wlanReport\wlan-report-latest.html %temp%\LOGS\Network\wlan-report-latest.html"   
                     ##WIN7 Does not Support netsh wlanreport                                                    
                     }   
      
     Start-Job -Name showWLAN -ScriptBlock $showWLANjob  
      
     } ## End function sysProductCheck  
      
      
 function getGPRESULT  
     {  
     wh "`nGetting GPRESULT...`n"  
     CMD.EXE /C "GPRESULT /V > %temp%\LOGS\GPRESULT.TXT"  
          
     } ## End function getGPRESULT  
      
      
 function reservedCheck  
     {       
             
     $reservedJob =   
         {  
         $vol = (mountvol /L | select-string -Pattern "\\\\")  
         $volstring = "mountvol y:" + $vol[0]  
         CMD.EXE /C $volstring  
          
         SLEEP 2  
      
         CMD.EXE /C "CHKDSK y: > %temp%\LOGS\SystemReserved.TXT"  
          
         SLEEP 2 # Pause after drive dismount  
          
         CMD.EXE /C "mountvol y: /D"  
         }  
      
     Start-Job -Name reservedJob -ScriptBlock $reservedJob  
          
     } ## End function reservedCheck  
      
      
 function fltmcCheck  
     {  
     wh "`n Getting fltmc Filters ...`n"  
     CMD.EXE /c "fltmc filters > %temp%\LOGS\fltmc_filters.TXT"  
          
     } ## End function fltmcCheck  
      
      
 function getDXDiag  
     {  
     wh "`n Grabbing DXDiag Info...`n"  
     C:\Windows\System32\dxdiag /x $explore\DxDiag  
          
     } ## End function getDXDiag  
      
      
 function getMSINFO  
     {  
     wh "`n Gathering MSINFO32 ...`n"  
     ## check if msinfo is already gathering - if so stop  
     If((get-process | select-string -Pattern "msinfo").Pattern -eq "msinfo")  
     {Stop-Process -ProcessName msinfo32}  
      
         C:\Windows\System32\msinfo32.exe /nfo $tempDir/LOGS/MSINFO32.NFO  
                     
     } ## End function getMSINFO  
      
      
 function getAV  
     {  
      if((Get-Host).Version.Major -cge 5) ##Modern OS Only  
         {  
         wh "`n Grab root\SecurityCenter2 AntivirusProduct ...`n"  
         $avPath = (Get-WmiObject -Namespace root\SecurityCenter2 -Class AntivirusProduct) | % {$_.pathtoSignedProductEXE}  
         "AV Info" + "`n========" | Out-File $tempDir/LOGS/SecurityProductInformation.TXT 
     $avPath | Out-File $tempDir/LOGS/SecurityProductInformation.TXT -Append  
         if($avPath[0] -match "exe")  
             {   
                 $path = (Get-Item $avPath[0]).PSParentPath  
                 Get-Item $path/*.ini | Out-File $tempDir/LOGS/SecurityProductInformation.TXT -Append  
                 Get-Content $path/*.ini | Out-File $tempDir/LOGS/SecurityProductInformation.TXT -Append             
             }  
             Get-ChildItem "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\" -recurse -EA SilentlyContinue | Out-File $tempDir/LOGS/SecurityProductInformation.TXT -Append      
         }  
     } ## End function getAV  
      
      
 function getDrivers  
     {  
     wh "`n Grabbing Driver listing via DISM.EXE ...`n"  
         $drivers = cmd.exe /C "dism /online /get-drivers /format:table"  
         $drivers += cmd.exe /C "dism /online /get-drivers /all /format:table"  
         $drivers | Out-File $tempDir/LOGS/DISM-Get-Drivers.TXT  
     wh "`n Done!`n"  
     } ## End Function getDrivers  
      
      
 function getMISCLogs  
     {  
         wh "`nCopying misc. logs ...`n"   
         MD $tempDir\LOGS\WER\ -EA SilentlyContinue   
         MD $tempDir\LOGS\Windows\Logs\WindowsUpdate\ -EA SilentlyContinue  
         CP "C:\Users\All Users\Microsoft\Windows\WER\ReportArchive\*" $tempDir\LOGS\WER\ -Recurse -EA SilentlyContinue  
         CP "C:\Windows\Logs\CBS\*cbs*" $tempDir\LOGS\Windows\Logs\  
         CP "C:\Windows\Logs\DISM\*dism*" $TempDir\LOGS\Windows\Logs\  
         CP "C:\Windows\Logs\WindowsUpdate\*" $TempDir\LOGS\Windows\Logs\WindowsUpdate\  
      
                
         #DMP Collect  
         $dmp = @()  
         $dmp += Get-ChildItem C:\Windows\*.dmp   
         $dmp += (Get-ChildItem C:\Windows\LiveKernelReports\*.dmp -Recurse -EA SilentlyContinue)  
         $dmp += (Get-ChildItem C:\Windows\Minidump\*.dmp -Recurse -EA SilentlyContinue)  
         #Validate empty array  
         if($dmp.length -ne 0)  
             {  
             $dd=0  
                   Do{       
                         If($dmp[$dd].length -lt 2000000)  
                             { $destPath = $dmp[$dd].PSParentPath.Replace('C:\', '').Replace('Microsoft.PowerShell.Core\FileSystem::', '')  
                                 MD $destPath -EA SilentlyContinue 
                                     COPY -Path $dmp[$dd].PSPath -Destination $destPath }  
                         $dd++  
                     }  
                     Until($dd -eq $dmp.Count)  
             }  
     
          #disk info 
          "`nGet-Disk:`n=========" > $tempDir\LOGS\Disk-Info.TXT  
          Get-Disk |fl >> $tempDir\LOGS\Disk-Info.TXT 
          "`nGet-Partition:`n==============" >> $tempDir\LOGS\Disk-Info.TXT  
          Get-Partition >> $tempDir\LOGS\Disk-Info.TXT 
          Manage-bde -protectors -get C: >> $tempDir\LOGS\Disk-Info.TXT 
          "`nIO Fail Search:`n===============`n" >> $tempDir\LOGS\Disk-Info.TXT 
          $search | Select-String ".*io.fail.*" | Select-String -NotMatch '0, 0, 0, 0' >> $tempDir\LOGS\Disk-Info.TXT        
      
     } ## End function getMISCLogs  
      
      
 function bingCollect  
     {  
         ##O365 Firewall Check & Bing.com diagnostics.asp  
         ##URIs based on Article:   
         ##https://support.office.com/en-us/article/Network-requests-in-Office-365-ProPlus-and-Mobile-eb73fcd1-ca88-4d02-a74b-2dd3a9f3364d  
                    
         MD $TempDir\LOGS\Network\ -EA SilentlyContinue  
      
         wh "Performing Bing & O365 URI Check ... `n"  
      
      
               $bingCheck = (Invoke-WebRequest -Uri https://www.bing.com/fdv2/diagnostics.aspx -UseBasicParsing)   
               $bingCheck | Out-File $tempDir\LOGS\Network\O365-URL-Query.TXT  
                     
               $URIs = @('api.login.microsoftonline.com',    #0  Standard Reply = 403  
               'api.passwordreset.microsoftonline.com',      #1  Standard Reply = 200  
               'becws.microsoftonline.com',                  #2  Standard Reply = 403  
               'clientconfig.microsoftonline-p.net',         #3  Standard Reply = 404  
               'companymanager.microsoftonline.com',         #4  Standard Reply = 403  
               'device.login.microsoftonline.com',           #5  Standard Reply = 200  
               'graph.microsoft.com',                        #6  Standard Reply = 404  
               'hip.microsoftonline-p.net',                  #7  Standard Reply = 404   
               'hipservice.microsoftonline.com',             #8  Standard Reply = 404  
               'login.microsoft.com',                        #9  Standard Reply = 200  
               'login.microsoftonline.com',                  #10 Standard Reply = 200  
               'logincert.microsoftonline.com',              #11 Standard Reply = 200   
               'loginex.microsoftonline.com',                #12 Standard Reply = 200  
               'login-us.microsoftonline.com',               #13 Standard Reply = 200  
               'login.microsoftonline-p.com',                #14 Standard Reply = 200  
               'login.windows.net',                          #15 Standard Reply = 200  
               'nexus.microsoftonline-p.com',                #16 Standard Reply = 403  
               'passwordreset.microsoftonline.com',          #17 Standard Reply = 200  
               'provisioningapi.microsoftonline.com',        #18 Standard Reply = 403  
               'stamp2.login.microsoftonline.com',           #19 Standard Reply = 200  
               'ccs.login.microsoftonline.com',              #20 Standard Reply = 401  
               'ccs-sdf.login.microsoftonline.com',          #21 Standard Reply = 401  
               'accounts.accesscontrol.windows.net',         #22 Standard Reply = 200  
               'secure.aadcdn.microsoftonline-p.com',        #23 Standard Reply = 400  
               'windows.net',                                #24 Standard Reply = 200  
               'phonefactor.net',                            #25 Standard Reply = 200  
               'account.activedirectory.windowsazure.com',   #26 Standard Reply = 404  
               'secure.aadcdn.microsoftonline-p.com',        #27 Standard Reply = 400  
               'login.windows.net',                          #28 Standard Reply = 200  
               'provisioningapi.microsoftonline.com',        #29 Standard Reply = 403  
               'mscrl.microsoft.com',                        #30 Standard Reply = 400  
               'secure.aadcdn.microsoftonline-p.com',        #31 Standard Reply = 400  
               'windowsupdate.microsoft.com',                #32 Standard Reply = 200  
               'update.microsoft.com',                       #33 Standard Reply = 200  
               'au.download.windowsupdate.com',              #34 Standard Reply = 200  
               'download.windowsupdate.com',                 #35 Standard Reply = 200  
               'download.microsoft.com',                     #36 Standard Reply = 200  
               'tlu.dl.delivery.mp.microsoft.com');          #37 Standard Reply = 403  
              
                     
               $count = 0;  
               $queryResult =@{};  
                     
               Write-Host "Checking URIs .." -NoNewline  
                     
               Do {           
                       Try{  
                       $queryResult[$count] = (Invoke-WebRequest -Uri ("http:`/`/" + $URIs[$count]) -Method Head -UseBasicParsing -TimeoutSec 2).RawContent  
                          }Catch{ $catch = $_ }  
                     
                           if($queryResult[$count].Count -eq 0)  
                                   {$queryResult[$count] = ($catch[$catch.count -1].ToString()).Replace("`n", " ")}                                     
                       Write-Host "." -NoNewline           
                       $count++         
                   }Until ($count -eq ($URIs.Count));                            
               Write-Host "."  
                      
                   Get-Date | Out-File $tempDir\LOGS\Network\O365-URL-Query.TXT -Append  
                   $queryResult | Out-File $tempDir\LOGS\Network\O365-URL-Query.TXT -Append  
                        
         Write-Host " Bing Check", `n, "==========" | Out-File $tempDir\LOGS\Network\O365-URL-Query.TXT -Append  
            
               wh "`n`n`n`URL Check Finished...`n"   
     }  
      
      
 function smbConfig  
 {  
      
     $CMDs =  
     {   cmd.exe /c "net config server"    
         cmd.exe /c "net config workstation"  
         Get-SmbClientNetworkInterface  
         Get-SmbServerConfiguration  
         Get-SmbClientConfiguration  
         Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer"   
         Get-NetAdapterAdvancedProperty | ft }  
      
     ForEach-Object{Invoke-Command $CMDs | Out-File $TempDir\LOGS\NETWORK\$env:COMPUTERNAME-SMB-Config.TXT -Append}  
      
     $share = Get-SmbShare  
      
     ForEach-Object{Get-SmbShareAccess $share.Name | ft  | Out-File $tempDir\LOGS\NETWORK\$env:COMPUTERNAME-SMB-Config.TXT -Append}  
      
 } ## End Function smbConfig  
      
      
 function regLang  
     {       
         DISM.EXE /Online /Get-Intl  | Out-File $tempDir\LOGS\Reg-Lang.TXT  
         "`n","Get-WinUserLanguageList","=======================" | Out-File $tempDir\LOGS\Reg-Lang.TXT -Append  
         Get-WinUserLanguageList     | Out-File $tempDir\LOGS\Reg-Lang.TXT -Append  
         "`n","Get-WinLanguageBarOption","========================" | Out-File $tempDir\LOGS\Reg-Lang.TXT -Append  
         Get-WinLanguageBarOption    | Out-File $tempDir\LOGS\Reg-Lang.TXT -Append  
     }  
      
      
 function autoRotate  
     {  
         Get-ChildItem HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Auto* | Out-File $tempDir\LOGS\AutoRotate.TXT  
     }  
      
      
 function checkBoxes  
    {  
         Add-Type -AssemblyName System.Windows.Forms  
         Add-Type -AssemblyName System.Drawing  
      
         $Global:form = New-Object System.Windows.Forms.Form  
         $Global:form.Text = "LOGS-V$ver"  
         $Global:form.Size = New-Object System.Drawing.Size(300,400)  
         $Global:form.StartPosition = 'CenterScreen'  
      
         $OKButton = New-Object System.Windows.Forms.Button  
         $OKButton.Location = New-Object System.Drawing.Point(100,300)  
         $OKButton.Size = New-Object System.Drawing.Size(75,23)  
         $OKButton.Text = 'OK'  
         $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK  
         $Global:form.AcceptButton = $OKButton  
         $Global:form.Controls.Add($OKButton)  
             
         $Global:form.ControlBox = $false  
              
             $Global:boxNum = 1  
             $Global:checkBox = @{} #hash for $checkBox  
             $tag = @{} #hash for $label  
             $Global:Box = @{}  
      
             function createCheckBox   
                 {  
                     Param ( [parameter (Mandatory = $true)][string]$name,  
                             [parameter (Mandatory = $true)][string]$label )  
                          
                     $drawingPoint = (50 + ($boxNum *25))  
      
                     $Global:checkBox[$boxNum] = New-Object System.Windows.Forms.CheckBox  
                     $Global:checkBox[$boxNum].Location = New-Object System.Drawing.Point(10,$drawingPoint)  
                     $Global:checkBox[$boxNum].Size = New-Object System.Drawing.Size(15,15)  
                     $Global:checkBox[$boxNum].Text = ''  
                     $Global:checkBox[$boxNum].Checked = $true  
                     $Global:form.Controls.Add($checkBox[$boxNum])  
                     #SetupDiag Label  
                     $tag[$boxNum] = New-Object System.Windows.Forms.Label  
                     $tag[$boxNum].Location = New-Object System.Drawing.Point(40,$drawingPoint)  
                     $tag[$boxNum].Size = New-Object System.Drawing.Size(280,20)  
                     $tag[$boxNum].Text = "$label"  
                     $Global:form.Controls.Add($tag[$boxNum])  
      
                     $Global:boxNum ++  
                      
                 } #End nested function createCheckBox   
                
             createCheckBox -name "EV" -label "EventSearch EventLog Helper"       #1  
             createCheckBox -name "SD" -label "SetupDiag.EXE Setup Diagnostics"   #2  
             createCheckBox -name "WU" -label "Get-WindowsUpdateLog Collection"   #3  
             createCheckBox -name "IP" -label "Network Information"               #4  
             createCheckBox -name "PW" -label "POWERCFG. Sleep & Battery Info"    #5  
             createCheckBox -name "GP" -label "GPResult Info"                     #6  
             createCheckBox -name "MS" -label "General Machine Info"              #7  
             createCheckBox -name "EO" -label "EventSearch Out-GridView"          #8            
                     
             #Checkbox State Changes               
             $Global:checkBox[1].Add_CheckStateChanged(  
                     {   
                         if($Global:checkBox[1].checked -eq $True){ $Global:EventsCollect = $true ; Write-Host "." -nonewline} Else{ $Global:EventsCollect = $false }  
                                  
                     })             
             $Global:checkBox[2].Add_CheckStateChanged(  
                     {   
                         if($Global:checkBox[2].checked -eq $True){ $Global:SetupDiagCollect = $true ; Write-Host "." -nonewline} Else{ $Global:SetupDiagCollect = $false }  
                                  
                     })  
             $Global:checkBox[3].Add_CheckStateChanged(  
                     {   
                         if($Global:checkBox[3].checked -eq $True){ $Global:UpdatesCollect = $true ; Write-Host "." -nonewline} Else{ $Global:UpdatesCollect = $false }  
                                  
                     })  
             $Global:checkBox[4].Add_CheckStateChanged(  
                     {   
                         if($Global:checkBox[4].checked -eq $True){ $Global:WLANCollect = $true ; Write-Host "." -nonewline} Else{ $Global:WLANCollect = $false }  
                                  
                     })  
      
             $Global:checkBox[5].Add_CheckStateChanged(  
                     {   
                         if($Global:checkBox[5].checked -eq $True){ $Global:PowerCollect = $true ; Write-Host "." -nonewline} Else{ $Global:PowerCollect = $false }  
                                  
                     })  
             $Global:checkBox[6].Add_CheckStateChanged(  
                     {   
                         if($Global:checkBox[6].checked -eq $True){ $Global:GPCollect = $true ; Write-Host "." -nonewline} Else{ $Global:GPCollect = $false }  
                                  
                     })  
             $Global:checkBox[7].Add_CheckStateChanged(  
                     {   
                         if($Global:checkBox[7].checked -eq $True){ $Global:miscCollect = $true ; Write-Host "." -nonewline} Else{ $Global:miscCollect = $false }  
                                  
                     })  
      
              $Global:checkBox[8].Add_CheckStateChanged(  
                     {   
                         if($Global:checkBox[8].checked -eq $True){ $Global:eventOut = $true ; $Global:checkBox[1].checked = $true; Write-Host "x" -nonewline} Else{ $Global:eventOut = $false }  
                                  
                     })  
                                               
         $Global:checkBox[8].Checked = $false  
         $mainText = New-Object System.Windows.Forms.Label  
         $mainText.Location = New-Object System.Drawing.Point(62,30)  
         $mainText.Size = New-Object System.Drawing.Size(260,20)  
         $mainText.Text = 'Choose which logs to collect:'  
         $Global:form.Controls.Add($mainText)  
         $result = $Global:form.ShowDialog()  
         SLEEP 1  #testing Topmost lag  
         $Global:form.Topmost = $true  
      
         #OK Button ...   
         if ($result -eq [System.Windows.Forms.DialogResult]::OK)  
         {  
             $x = $textBox.Text  
             $x  
         }       
      
     } #End function checkBoxes  
      
      
 Function werHint  
 {  
     $WERs = Get-ChildItem $tempDir\LOGS\WER\*.wer -Recurse  
      
     $WERArray = @()  
      
     $Date = $WERs | Select-String -pattern "eventtime=" | % {$_ -Replace("C:.*EventTime=", "")}  
     $eventType = $WERs | Select-String -pattern "EventType=" | % {$_ -Replace("C:.*EventType=", "")}  
     $Sig0Nam = $WERs | Select-String -pattern "Sig\[0\].Name" | % {$_ -Replace("C:.*Sig\[0\].Name=", "")}  
     $Sig0Val = $WERs | Select-String -pattern "Sig\[0\].Value" | % {$_ -Replace("C:.*Sig\[0\].Value=", "")}  
     $Sig3 = $WERs | Select-String -pattern "Sig\[3\].Value" | % {$_ -Replace("C:.*Sig\[3\].Value=", "")}  
     $Sig3 = $WERs | Select-String -pattern "Sig\[3\].Value" | % {$_ -Replace("C:.*Sig\[3\].Value=", "")}  
     $Sig4 = $WERs | Select-String -pattern "Sig\[4\].Value" | % {$_ -Replace("C:.*Sig\[4\].Value=", "")}  
      
     #ConvertDateTime  
     $epoch = [datetime]"01/01/1601 00:00"  
     $date = $date | foreach{$epoch.AddSeconds($_/10000000)}   
     $convertedDate = foreach($Date in $Date) {Get-Date $Date -Format G}  
      
     $WERarray = 0..($convertedDate.Length -1) | Select-Object @{n="Id";e={$_}},   
         @{n="Date";e={$convertedDate[$_]}}, @{n="EventType";e={$eventType[$_]}},  
             @{n="S0-Name";e={$Sig0Nam[$_]}}, @{n="S0-Value";e={$Sig0Val[$_]}}, @{n="S3";e={$Sig3[$_]}},   
                 @{n="S4";e={$Sig4[$_]}}  
      
     $WERArray |Sort-Object -Descending Date | ft -autosize Date, EventType, S0-Name, S0-Value, S3, S4  |   
         Out-File $tempDir\LOGS\WER-SUMMARY.TXT -Width 500  
      
 } ## End Function werHint  
      
      
      
 ### FUNCTIONS_INIT ###   
      
         $Script:Cancel = @{}  
      
         StartScript #function  
         checkBoxes  
              
         ## SetupDiagCollect   #2  
         if($Global:SetupDiagCollect -eq $True)  
             {  
             SetupDiagFunc #function & job   
             wh "...`n"  
             }  
         ## EventSearch         #1  
         if($Global:EventsCollect -eq $True)  
             {  
             EventSearch #function & job  
             wh "...`n"  
             }  
      
         ## Get-WindowsUpdate   #3  
         if($Global:UpdatesCollect -eq $True)  
             {  
             GetUpdates #function & job  
             wh "...`n`n"  
             }  
      
         ## WLAN/Wifi Collect    #4  
         if($Global:WLANCollect -eq $True)      
             {  
             bingCollect #function  
             wh "...`n"  
             showWLAN #function & job   
             wh "...`n"  
             smbConfig #function  
             }  
      
         ## Power/Battery Collect:#5  
         if($Global:PowerCollect -eq $True)  
             {  
             powerCFGInfo #function - make job takes a min  
             wh "...`n"  
             }  
      
         ## GPRESULT Collection:  #6  
         if($Global:GPCollect -eq $True)  
             {  
             getGPRESULT #function  
             wh "...`n"  
             }  
      
         ## Misc Logs Collection: #7        
         if($Global:miscCollect -eq $True)  
             {  
             getMSINFO #function & job  
                 wh "...`n"  
             PrinterCheck #function  
                 wh "...`n"  
             getProcesses #function  
                 wh "...`n"  
             getApps #function - make job - takes a min  
                 wh "...`n"  
             SetupLogs #function  
                 wh "...`n"       
             sysProductCheck #function  
                 wh "...`n"                 
             reservedCheck #function  
                 wh "...`n"  
             fltmcCheck #function  
                 wh "...`n"  
             getDXDiag #function  
                 wh "...`n"  
             regLang #function  
                 wh "...`n"  
             autoRotate #function  
             getMISCLogs #function  
                 wh "...`n"  
             getDrivers #function  
                 wh "...`n"   
             getAV #function  
                 wh "...`n"            
              }  
            
      
 #### RECEIVING JOBS SECTION ###...   
      
         #EventSearchJob  
         if($Global:EventsCollect -eq $True)  
         {          
             wh "`nWaiting for EventSearchJob to complete...`n"  
      
             Receive-Job -Name EventSearchJob -OutVariable eventSearch -Wait   
             $search = $eventSearch.Line  
         }  
      
      
         if($Global:SetupDiagCollect -eq $True)  
         {  
             #SetupDiagJob - Receive-Job  
             $stamp = (Get-Date -format "hh:mm tt")  
             wh "`nWaiting for SetupDiagJob to complete..."  
             wh "`nTime Stamp: $stamp"  
             wh "`nThis can take up to 10 minutes ..."  
      
             Do{  
               SLEEP 15  
                 wh "."  
                 if((Get-Job -name SetupDiagJob).State -eq "Completed")  
                     { Receive-Job -Name SetupDiagJob  
                            wh "`nSetupDiag Completed!"                         
                         Break                      }  
                                 }Until($Cancel.SetupDiag -eq $True)  
             wh `n  
                                                   
             #Receive file and copy  
             Receive-Job -Name SetupDiagJob -Wait   
             Copy-Item $tempDir\Logs*.zip $tempDir\LOGS\SetupDiag-Log.zip  
             Copy-Item $tempDir\setupdiag*.log $tempDir\LOGS\  
             Remove-Item $tempDir\Logs*.zip  
         }  
      
           
         if($Global:UpdatesCollect -eq $True)  
         {  
             #GetUpdates Job via:  
             #UpdateHelper <--- GetUpdates Job has to finish first!  
             #Checking Status of GetUpdates Job...  
             wh "Checking Status of GetUpdates Job...`n"  
             If ((Get-Job -Name GetUpdates).State -eq "Failed")  
                 { wh "`nGetUpdates Job Failed!`n" }  
                     Else{  
                             Receive-Job -Name GetUpdates -wait  
                             Move $env:USERPROFILE\Desktop\WindowsUpdate.log $TempDir\LOGS\Windows-Update.log -Force  
                             wh "`n Writing Update Helper Info to UPDATE-ERRORS.TXT ... `n"  
                             UpdateHelper #run the update helper function  
                         }               
         } #End getting GetUpdates-job       
      
         #Finishing EventSearch  
         if($Global:EventsCollect -eq $True)  
             {  
                 writeSearch #function  
             }  
      
 #Wait on MSINFO...  
 if($Global:miscCollect -eq $True)  
 {  
     wh "`n Waiting for MSINFO32 to Complete ...`n"  
     do{ start-sleep 1 }  
     Until((get-process | select-string -Pattern "msinfo").Pattern -cne "msinfo")  
         werHint #function  
 }  
      
      
 if((Get-Host).Version.Major -cge 5) ##WIN7 Does not Support Transcript  
     {  
      
 Stop-Transcript   
      
         do{  
     start-sleep 1  
     }  
     Until((get-item $tempDir\LOGS\Event-Search.TXT).Length -cne 0)  
          
     }  
      
 wh "`nLog Collection Completed! `nLogs are available in %temp%\LOGS\`n"    
 wh "`nHit Any Key or Close ...`n"  
      
 Start-Sleep 1  
      
 Start Explorer.exe $explore  
      
 PAUSE  
      
 ## LOGS.PS1 1.6.3  ##     
 ## JOHNEM 8-2019 ##   
 ## EOF ##







5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

SamsonPeng-MSFT avatar image
0 Votes"
SamsonPeng-MSFT answered SamsonPeng-MSFT commented

Hello there,

I think your computer may have issue in setup “Safe-OS” phase.
Since failure happened when using Feature update to upgrade, I suggest using other two ways to install Version 20H2.
https://www.microsoft.com/en-us/software-download/windows10

Plan A - Update Assistant
1. Download the Update Assistant from this website.
2. The Update Assistant can help you check compatibility and update to the latest version of Windows 10. To get started, click Update now.
98145-5201.png

Plan B - Manual
Download Create Windows 10 installation media tool from the website and follow the instruction.
98162-5202.png

Note: If these two ways still can’t help, prepare a blank USB flash drive with at least 8GB of space, create a bootable installation media and start setup from the ISO file.

Best Regards,
Samson Peng



5201.png (80.2 KiB)
5202.png (287.5 KiB)
· 5
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

I have tried the Update Assistant & no success. I tried this way many times when attempting to change to 20H2 version as well as using Windows Update & MediaCreationTool20H2. NONE of them have helped. I've also tried disconnecting all external devices (leaving just keyboard, mouse, monitor & internet connection), all to no avail. The only thing left I can try is to create the install media & save to a small (2Gb) memory card to see if that works, but I highly doubt the card has enough space available for it once created.
Any other suggestions are welcome. Also I have no idea about ISO files or how to create & use them.

0 Votes 0 ·

This is an upgrade troubleshooting checklist.

If all of the steps fail then there are two options:

1) Troubleshoot the logs: see earlier PS script

2) Save files and install a fresh operating system: reset save files, Windows refresh, custom install, clean install, etc.
(all of these require the reinstallation of drivers and applications)







0 Votes 0 ·

I have just tried using the media creation tool to create an ISO file, which I saved to my external hard drive. Following instructions I got from Microsoft's website, I ran the file step-by-step & set all the relevant parameters as described. After the program ran fully (i.e. tried to install Windows 10) it came up with the following error:-

0xC1900101-0x20017 - Failure in SAFE_OS phase with an error during the BOOT operation.

Having had this error before & investigating its meaning, I know it is an error in a driver that has prevented the installation from being successful. However, all my drivers (as checked in Device Manager) are up-to-date. I've also tried having just a wired mouse, wired keyboard, monitor & internet lead connected & it has made NO difference.

HOW CAN I SOLVE THIS ISSUE if the drivers (as far as I can tell)) are all ok?

0 Votes 0 ·

Earlier in the thread a script was posted.

When run it collects log files to troubleshoot the upgrade failures.

The assumption that updating drivers should fix this upgrade failure is incorrect.

The failure is likely due to migration failure.

Please run the earlier PS script > post a share link

Run V2 > post a share link into this thread:

https://www.windowsq.com/resources/v2-log-collector.8/
https://www.tenforums.com/bsod-crashes-debugging/2198-bsod-posting-instructions.html



Please remember to vote and to mark the replies as answers if they help.





0 Votes 0 ·

Hello there,

I am checking to see how things are going there on this issue.

Have you tried the script posted earlier in this thread?
To use Powershell in Win10,press Win+X , then select Windows PowerShel(Admin).

Please let us know if you would like further assistance.

Best regards,
Samson Peng

0 Votes 0 ·
KapilArya avatar image
0 Votes"
KapilArya answered

Hello,

I suggest you to temporarily disconnect all external devices connected to system and then try upgrade. Also, make sure you remove third-party AV or any security system to complete the upgrade.

If this doesn't works, I recommend you to upgrade to latest version i.e. Version 21H1 via ISO file. Note that 20H2 is no longer latest version and 21H1 is just released now.

Refer this step-by-step guide:

https://www.kapilarya.com/how-to-upgrade-to-windows-10-using-iso-file

Let us know if this helps!

Note: Included link in this reply refers to blog post by a trusted Microsoft MVP. 

5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

DSPatrick avatar image
0 Votes"
DSPatrick answered DSPatrick edited

Might try creating the install media here and boot from it.
https://www.microsoft.com/en-us/software-download/windows10


--please don't forget to Accept as answer if the reply is helpful--




5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.