| [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 |
| } |