From 27dc4567b4da739a7b45514ecffd8ed149a942ee Mon Sep 17 00:00:00 2001 From: Mark Young Date: Tue, 31 May 2016 14:34:08 -0600 Subject: winrt: Add more Powershell logging to RT install RT install Powershell script was using echo. Now use transcript recording (which will also include OS, Powershell version, and other info). Also, use Write-Host, Write-Warning, and Write-Error to make errors and warnings more obvious. NOTE: This includes intentional debug code enablement so I can retrieve an RT install that does not remove a copy of the Powershell log file. This will be fixed quickly after the RT install is generated on CruiseControl. --- .../ConfigLayersAndVulkanDLL.ps1 | 227 +++++++++++++-------- 1 file changed, 145 insertions(+), 82 deletions(-) (limited to 'windowsRuntimeInstaller') diff --git a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 index 28819323..0fd7aa40 100644 --- a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 +++ b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 @@ -39,13 +39,24 @@ Param( [int]$ossize ) +# Clear any pre-existing errors +$Error.Clear(); + # Start logging $log=$Env:Temp+"\VulkanRT" New-Item -ItemType Directory -Force -Path $log | Out-Null $logascii=$log+"\ConfigLayersAndVulkanDLL.log" + +# Temp to be used for debugging failure to install issue +$logascii2=$Env:Temp+"\ConfigLayersAndVulkanDLL_debug.log" + $log=$log+"\ConfigLayersAndVulkanDLL16.log" -echo "ConfigLayersAndVulkanDLL.ps1 $majorabi $ossize" >$log -(Get-Date).ToString() >>$log + +start-transcript -path $log + +Write-Host "ConfigLayersAndVulkanDLL.ps1 called with inputs of : $majorabi $ossize" +$startTime=Get-Date +Write-Host "Start time : $startTime" $vulkandll = "vulkan-"+$majorabi+".dll" $windrive = $env:SYSTEMDRIVE @@ -96,7 +107,7 @@ function notNumeric ($x) { function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) { - echo "UpdateVulkanSysFolder $dir $writeSdkName" >>$log + Write-Host "UpdateVulkanSysFolder $dir $writeSdkName" # Push the current path on the stack and go to $dir Push-Location -Path $dir @@ -108,33 +119,39 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # Find all vulkan dll files in this directory dir -name vulkan-$majorabi-*.dll | ForEach-Object { - echo "File $_" >>$log + Write-Host "File $_" if ($_ -match "=" -or $_ -match "@" -or $_ -match " " -or - ($_.Split('-').count -lt 6) -or - ($_.Split('-').count -gt 8)) + ($_.Split('-').count -lt 6) -or + ($_.Split('-').count -gt 8) -or + !$?) { # If a file name contains "=", "@", or " ", or it contains less then 5 dashes or more than # 7 dashes, it wasn't installed by the Vulkan Run Time. # Note that we need to use return inside of ForEach-Object is to continue with iteration. - echo "ERROR: Rejected $_ - bad format" >>$log + Write-Warning "Ignoring $_ - bad format" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder object $_ is bad format" >>$log; - } # If the corresponding vulkaninfo is not present, it wasn't installed by the Vulkan Run Time $vulkaninfo=$_ -replace ".dll",".exe" $vulkaninfo=$vulkaninfo -replace "vulkan","vulkaninfo" - if (-not (Test-Path $vulkaninfo)) { - echo "ERROR: Rejected $_ - vulkaninfo not present" >>$log + if (-not (Test-Path $vulkaninfo) -or + !$?) { + Write-Warning "Rejected $_ - $vulkaninfo not present" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder failed generating vulkaninfo exe name" >>$log; - } $major=$_.Split('-')[2] $majorOrig=$major @@ -177,31 +194,62 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) $prebuildno="z"*10 } } - echo "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" >>$log + Write-Host "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" if (!$?) { - echo "ERROR: UpdateVulkanSysFolder during version parsing" >>$log; + Write-Warning "Ignoring version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop + return } # Make sure fields that are supposed to be numbers are numbers if (notNumeric($major)) { - echo "ERROR: Rejected $_ - bad major" >>$log + Write-Warning "Ignoring $_ - bad major" + + # Not a real d, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } if (notNumeric($minor)) { - echo "ERROR: Rejected $_ - bad minor" >>$log + Write-Warning "Ignoring $_ - bad minor" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } if (notNumeric($patch)) { - echo "ERROR: Rejected $_ - bad patch" >>$log + Write-Warning "Ignoring $_ - bad patch" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } if (notNumeric($buildno)) { - echo "ERROR: Rejected $_ - bad buildno" >>$log + Write-Warning "Ignoring $_ - bad buildno" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } if (notNumeric($prebuildno)) { if ($prebuildno -ne "z"*10) { - echo "ERROR: Rejected $_ - bad prebuildno" >>$log + Write-Warning "Ignoring $_ - bad prebuildno" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } } @@ -214,11 +262,10 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) $prebuildno = $prebuildno.padleft(10,'0') # Add a new element to the $VulkanDllList array - echo "Adding $_ to Vulkan dll list " >>$log + Write-Host "Adding $_ to Vulkan dll list " $script:VulkanDllList+="$major=$minor=$patch=$buildno=$prebuildno=$prerelease= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@" - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder adding DLL $_ to list" >>$log; + Write-Error "Error: UpdateVulkanSysFolder adding DLL $_ to list" } } @@ -229,31 +276,28 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # Sort the list. The most recent vulkan-*.dll will be in the last element of the list. [array]::sort($script:VulkanDllList) - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder sorting DLL list" >>$log; + Write-Error "Error: UpdateVulkanSysFolder sorting DLL list" } # Put the name of the most recent vulkan-*.dll in $mrVulkanDLL. # The most recent vulkanDLL is the second word in the last element of the # sorted $VulkanDllList. Copy it to $vulkandll. $mrVulkanDll=$script:VulkanDllList[-1].Split(' ')[1] - echo "copy $mrVulkanDll $vulkandll" >>$log + Write-Host "Copying $mrVulkanDll $vulkandll" Copy-Item $mrVulkanDll $vulkandll -force - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll" >>$log; + Write-Error "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll" } # Copy the most recent version of vulkaninfo--*.exe to vulkaninfo.exe. # We create the source file name for the copy from $mrVulkanDll. $mrVulkaninfo=$mrVulkanDll -replace ".dll",".exe" $mrVulkaninfo=$mrVulkaninfo -replace "vulkan","vulkaninfo" - echo "copy $mrVulkaninfo vulkaninfo.exe" >>$log + Write-Host "Copying $mrVulkaninfo vulkaninfo.exe" Copy-Item $mrVulkaninfo vulkaninfo.exe -force - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe" >>$log; + Write-Error "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe" } # Create the name used in the registry for the SDK associated with $mrVulkanDll. @@ -271,18 +315,17 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) if ($prebuildno -ne "") { $sdktempname=$sdktempname + "." + $prebuildno } - echo "sdkname = $sdktempname" >>$log + Write-Host "sdkname = $sdktempname" if (!$?) { - echo "ERROR: UpdateVulkanSysFolder encountered error generating temp SDK name" >>$log; + Write-Error "Error: UpdateVulkanSysFolder encountered error generating SDK name" } } # Return to our previous folder Pop-Location - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder popping location" >>$log; + Write-Error "Error: UpdateVulkanSysFolder popping location" } # Only update the overall script-scope SDK name if we're told to @@ -296,25 +339,23 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # We only care about SYSWOW64 if we're targeting a 64-bit OS if ($ossize -eq 64) { # Update the SYSWOW64 Vulkan DLLS/EXEs - echo "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" >>$log + Write-Host "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" UpdateVulkanSysFolder $winfolder\SYSWOW64 0 - if (!$?) { - echo "ERROR: Calling UpdateVulkanSysFolder for 64-bit OS" >>$log + Write-Error "Error: Calling UpdateVulkanSysFolder for 64-bit OS" } } # Update the SYSTEM32 Vulkan DLLS/EXEs -echo "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" >>$log +Write-Host "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" UpdateVulkanSysFolder $winfolder\SYSTEM32 1 - if (!$?) { - echo "ERROR: Calling UpdateVulkanSysFolder for all OS" >>$log + Write-Error "Error: Calling UpdateVulkanSysFolder for all OS" } # Create an array of vulkan sdk install dirs -echo "Creating array of of Vulkan SDK Install dirs" >>$log +Write-Host "Creating array of of Vulkan SDK Install dirs" $mrVulkanDllInstallDir="" $VulkanSdkDirs=@() Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | @@ -323,27 +364,29 @@ Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr if ($_ -match "\\VulkanSDK") { # Get the install path from UninstallString $tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString + if (!$?) { + Write-Error "Error: Get-ItemProperty failed for Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey" + } $tmp=$tmp -replace "\\Uninstall.exe.*","" $tmp=$tmp -replace ".*=.","" - echo "Adding $tmp to VulkanSDKDirs" >>$log + Write-Host "Adding $tmp to VulkanSDKDirs" $VulkanSdkDirs+=$tmp if ($regkey -eq $script:sdkname) { # Save away the sdk install dir for the the most recent vulkandll - echo "Setting mrVulkanDllInstallDir to $tmp" >>$log + Write-Host "Setting mrVulkanDllInstallDir to $tmp" $mrVulkanDllInstallDir=$tmp } } } - if (!$?) { - echo "ERROR: Failed creating array of of Vulkan SDK Install dirs" >>$log + Write-Error "Error: Failed creating array of of Vulkan SDK Install dirs" } # Search list of sdk install dirs for an sdk compatible with $script:sdkname. # We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK. if ($mrVulkanDllInstallDir -eq "") { - echo "Searching VulkanDllList" >>$log + Write-Host "Searching VulkanDllList" ForEach ($idx in ($script:VulkanDllList.Length-1)..0) { $tmp=$script:VulkanDllList[$idx] $vulkanDllMajor=$script:VulkanDllList[$idx].Split('@')[1] @@ -359,8 +402,13 @@ if ($mrVulkanDllInstallDir -eq "") { if ($vulkanDllPrebuildno) { $regEntry=$regEntry+"."+$vulkanDllPrebuildno } - echo "Comparing $regEntry" >>$log + Write-Host "Comparing $regEntry" $rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue + if (!$?) { + Write-Warning "Ignoring $regEntry because Get-ItemProperty failed to find corresponding SDK registry entry" + $Error.Clear(); + continue + } $instDir=$rval $instDir=$instDir -replace "\\Uninstall.exe.*","" $instDir=$instDir -replace ".*=.","" @@ -371,15 +419,14 @@ if ($mrVulkanDllInstallDir -eq "") { $reMinor=$rval.Split('.')[1] $rePatch=$rval.Split('.')[2] if ($reMajor+$reMinor+$rePatch -eq $vulkanDllMajor+$vulkanDllMinor+$vulkanDllPatch) { - echo "Setting mrVulkanDllInstallDir to $instDir" >>$log + Write-Host "Setting mrVulkanDllInstallDir to $instDir" $mrVulkanDllInstallDir=$instDir break } } } - if (!$?) { - echo "ERROR: Failed searching VulkanDLLList" >>$log + Write-Error "Error: Failed searching VulkanDLLList" } } @@ -398,20 +445,24 @@ $VulkanSdkDirs+="$windrive\VulkanSDK\0.9.3" # Note that we remove only those entries created by Vulkan SDKs. If other # layers were installed that are not from an SDK, we don't mess with them. -echo "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log +Write-Host "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property | ForEach-Object { $regval=$_ ForEach ($sdkdir in $VulkanSdkDirs) { if ($regval -like "$sdkdir\*.json") { Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval - echo "Removed registry value $regval" >>$log + if (!$?) { + Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval" + } else { + Write-Host "Removed registry value $regval" + } } } } if (!$?) { - echo "ERROR: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" } # Remove 32-bit layer registry value if we're targeting a 64-bit OS @@ -422,91 +473,103 @@ if ($ossize -eq 64) { ForEach ($sdkdir in $VulkanSdkDirs) { if ($regval -like "$sdkdir\*.json") { Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval - echo "Removed WOW6432Node registry value $regval" >>$log + if (!$?) { + Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval" + } else { + Write-Host "Removed WOW6432Node registry value $regval" + } } } } if (!$?) { - echo "ERROR: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" } } # Create layer registry values associated with Vulkan SDK from which $mrVulkanDll is from -echo "Creating new layer registry values" >>$log +Write-Host "Creating new layer registry values" if ($mrVulkanDllInstallDir -ne "") { # Create registry keys if they don't exist if (-not (Test-Path -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers)) { - echo "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Host "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null - if (!$?) { - echo "ERROR: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Error "Error: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" } } if ($ossize -eq 64) { if (-not (Test-Path -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers)) { - echo "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Host "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null - if (!$?) { - echo "ERROR: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Error "Error: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" } } } if ($ossize -eq 64) { - # Create registry values in normal registry location for 64-bit items on a 64-bit OS Get-ChildItem $mrVulkanDllInstallDir\Bin -Filter VkLayer*json | ForEach-Object { - echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log + Write-Host "Creating registry value $mrVulkanDllInstallDir\Bin\$_" New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null - if (!$?) { - echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin\$_" >>$log + Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_" } } + if (!$?) { + Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin | ForEach-Object " + } # Create registry values for the WOW6432Node registry location for 32-bit items on a 64-bit OS Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json | ForEach-Object { - echo "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_" >>$log + Write-Host "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_" New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null - if (!$?) { - echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin32\$_" >>$log + Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin32\$_" } } - + if (!$?) { + Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object " + } } else { - # Create registry values in normal registry location for 32-bit items on a 32-bit OS Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json | ForEach-Object { - echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log + Write-Host "Creating registry value $mrVulkanDllInstallDir\Bin\$_" New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null - if (!$?) { - echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin\$_" >>$log + Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_" } } - + if (!$?) { + Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object " + } } } # Final log output -echo "ConfigLayersAndVulkanDLL.ps1 completed" >>$log -(Get-Date).ToString() >>$log +Write-Host "ConfigLayersAndVulkanDLL.ps1 completed" +$endTime=Get-Date +Write-Host "End time: $endTime" + +Stop-Transcript # Convert logfile to ascii -cat $log | out-File -encoding ascii -filepath $logascii -remove-item $log +Get-Content $log | Out-File -encoding ascii -filepath $logascii + +# Temp to be used for debugging failure to install issue (as VulkanRT folder might get removed) +Get-Content $log | Out-File -encoding ascii -filepath $logascii2 + +# Remove the unicode log as we no longer need it. +Remove-Item $log # SIG # Begin signature block -- cgit v1.2.3