| 
									
										
										
										
											2019-08-20 10:27:52 -04:00
										 |  |  | [CmdletBinding()] | 
					
						
							|  |  |  | param( | 
					
						
							|  |  |  |     [Parameter(Mandatory = $true)] | 
					
						
							|  |  |  |     [string]$Source, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     [Parameter(Mandatory = $true)] | 
					
						
							|  |  |  |     [string]$Target) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # This script translates the output from 7zdec into UTF8. Node has limited | 
					
						
							|  |  |  | # built-in support for encodings. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # 7zdec uses the system default code page. The system default code page varies | 
					
						
							|  |  |  | # depending on the locale configuration. On an en-US box, the system default code | 
					
						
							|  |  |  | # page is Windows-1252. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Note, on a typical en-US box, testing with the 'ç' character is a good way to | 
					
						
							|  |  |  | # determine whether data is passed correctly between processes. This is because | 
					
						
							|  |  |  | # the 'ç' character has a different code point across each of the common encodings | 
					
						
							|  |  |  | # on a typical en-US box, i.e. | 
					
						
							|  |  |  | #   1) the default console-output code page (IBM437) | 
					
						
							|  |  |  | #   2) the system default code page (i.e. CP_ACP) (Windows-1252) | 
					
						
							|  |  |  | #   3) UTF8 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $ErrorActionPreference = 'Stop' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Redefine the wrapper over STDOUT to use UTF8. Node expects UTF8 by default. | 
					
						
							|  |  |  | $stdout = [System.Console]::OpenStandardOutput() | 
					
						
							|  |  |  | $utf8 = New-Object System.Text.UTF8Encoding($false) # do not emit BOM | 
					
						
							|  |  |  | $writer = New-Object System.IO.StreamWriter($stdout, $utf8) | 
					
						
							|  |  |  | [System.Console]::SetOut($writer) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # All subsequent output must be written using [System.Console]::WriteLine(). In | 
					
						
							|  |  |  | # PowerShell 4, Write-Host and Out-Default do not consider the updated stream writer. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Set-Location -LiteralPath $Target | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Print the ##command. | 
					
						
							|  |  |  | $_7zdec = Join-Path -Path "$PSScriptRoot" -ChildPath "externals/7zdec.exe" | 
					
						
							|  |  |  | [System.Console]::WriteLine("##[command]$_7zdec x `"$Source`"") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # The $OutputEncoding variable instructs PowerShell how to interpret the output | 
					
						
							|  |  |  | # from the external command. | 
					
						
							|  |  |  | $OutputEncoding = [System.Text.Encoding]::Default | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Note, the output from 7zdec.exe needs to be iterated over. Otherwise PowerShell.exe | 
					
						
							|  |  |  | # will launch the external command in such a way that it inherits the streams. | 
					
						
							|  |  |  | & $_7zdec x $Source 2>&1 | | 
					
						
							|  |  |  |     ForEach-Object { | 
					
						
							|  |  |  |         if ($_ -is [System.Management.Automation.ErrorRecord]) { | 
					
						
							|  |  |  |             [System.Console]::WriteLine($_.Exception.Message) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             [System.Console]::WriteLine($_) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | [System.Console]::WriteLine("##[debug]7zdec.exe exit code '$LASTEXITCODE'") | 
					
						
							|  |  |  | [System.Console]::Out.Flush() | 
					
						
							|  |  |  | if ($LASTEXITCODE -ne 0) { | 
					
						
							|  |  |  |     exit $LASTEXITCODE | 
					
						
							| 
									
										
										
										
											2019-06-26 21:12:00 -04:00
										 |  |  | } |