@@ -58,107 +58,186 @@ try
5858 # Initialize Azure.
5959 Import-Module $PSScriptRoot \ps_modules\VstsAzureHelpers_
6060 Initialize-AzModule - Endpoint $endpoint - azVersion $targetAzurePs
61-
62- # Generate the script contents.
63- Write-Host (Get-VstsLocString - Key ' GeneratingScript' )
64- $UpdatePSModulePathArgument = $null ;
65- if ($targetAzurePs )
61+
62+ if ($input_pwsh )
6663 {
67- $UpdatePSModulePathArgument = " -targetAzurePs $targetAzurePs "
68- }
64+ # Generate the script contents.
65+ Write-Host (Get-VstsLocString - Key ' GeneratingScript' )
66+ $UpdatePSModulePathArgument = $null ;
67+ if ($targetAzurePs )
68+ {
69+ $UpdatePSModulePathArgument = " -targetAzurePs $targetAzurePs "
70+ }
6971
70- $contents = @ ()
71- $contents += " `$ ErrorActionPreference = '$__vsts_input_errorActionPreference '"
72- if ($env: system_debug -eq " true" ) {
73- $contents += " `$ VerbosePreference = 'continue'"
74- }
72+ $contents = @ ()
73+ $contents += " `$ ErrorActionPreference = '$__vsts_input_errorActionPreference '"
74+ if ($env: system_debug -eq " true" ) {
75+ $contents += " `$ VerbosePreference = 'continue'"
76+ }
7577
76- $contents += " . $PSScriptRoot \UpdatePSModulePath.ps1 $UpdatePSModulePathArgument "
77- if ($scriptType -eq " InlineScript" ) {
78- $contents += " $scriptInline " .Replace(" `r`n " , " `n " ).Replace(" `n " , " `r`n " )
79- } else {
80- $contents += " . '$ ( " $scriptPath " .Replace(" '" , " ''" )) ' $scriptArguments " .Trim()
81- }
78+ $contents += " . $PSScriptRoot \UpdatePSModulePath.ps1 $UpdatePSModulePathArgument "
79+ if ($scriptType -eq " InlineScript" ) {
80+ $contents += " $scriptInline " .Replace(" `r`n " , " `n " ).Replace(" `n " , " `r`n " )
81+ } else {
82+ $contents += " . '$ ( " $scriptPath " .Replace(" '" , " ''" )) ' $scriptArguments " .Trim()
83+ }
8284
83- # Write the script to disk.
84- $__vstsAzPSScriptPath = [System.IO.Path ]::Combine($env: Agent_TempDirectory , ([guid ]::NewGuid().ToString() + " .ps1" ));
85- $joinedContents = [System.String ]::Join(
86- ([System.Environment ]::NewLine),
87- $contents )
88- $null = [System.IO.File ]::WriteAllText(
89- $__vstsAzPSScriptPath ,
90- $joinedContents ,
91- ([System.Text.Encoding ]::UTF8))
92-
93- # Prepare the external command values.
94- #
95- # Note, use "-Command" instead of "-File". On PowerShell v4 and V3 when using "-File", terminating
96- # errors do not cause a non-zero exit code.
97- if ($input_pwsh ) {
98- $powershellPath = Get-Command - Name pwsh.exe - CommandType Application | Select-Object - First 1 - ExpandProperty Path
99- } else {
100- $powershellPath = Get-Command - Name powershell.exe - CommandType Application | Select-Object - First 1 - ExpandProperty Path
101- }
102- Assert-VstsPath - LiteralPath $powershellPath - PathType ' Leaf'
103- $arguments = " -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command `" . '$ ( $__vstsAzPSScriptPath.Replace (" '" , " ''" )) '`" "
104- $splat = @ {
105- ' FileName' = $powershellPath
106- ' Arguments' = $arguments
107- ' WorkingDirectory' = $input_workingDirectory
108- }
85+ # Write the script to disk.
86+ $__vstsAzPSScriptPath = [System.IO.Path ]::Combine($env: Agent_TempDirectory , ([guid ]::NewGuid().ToString() + " .ps1" ));
87+ $joinedContents = [System.String ]::Join(
88+ ([System.Environment ]::NewLine),
89+ $contents )
90+ $null = [System.IO.File ]::WriteAllText(
91+ $__vstsAzPSScriptPath ,
92+ $joinedContents ,
93+ ([System.Text.Encoding ]::UTF8))
94+
95+ # Prepare the external command values.
96+ #
97+ # Note, use "-Command" instead of "-File". On PowerShell v4 and V3 when using "-File", terminating
98+ # errors do not cause a non-zero exit code.
99+ if ($input_pwsh ) {
100+ $powershellPath = Get-Command - Name pwsh.exe - CommandType Application | Select-Object - First 1 - ExpandProperty Path
101+ } else {
102+ $powershellPath = Get-Command - Name powershell.exe - CommandType Application | Select-Object - First 1 - ExpandProperty Path
103+ }
104+ Assert-VstsPath - LiteralPath $powershellPath - PathType ' Leaf'
105+ $arguments = " -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command `" . '$ ( $__vstsAzPSScriptPath.Replace (" '" , " ''" )) '`" "
106+ $splat = @ {
107+ ' FileName' = $powershellPath
108+ ' Arguments' = $arguments
109+ ' WorkingDirectory' = $input_workingDirectory
110+ }
109111
110- # Switch to "Continue".
111- $global :ErrorActionPreference = ' Continue'
112- $failed = $false
112+ # Switch to "Continue".
113+ $global :ErrorActionPreference = ' Continue'
114+ $failed = $false
113115
114- # Run the script.
115- Write-Host ' ========================== Starting Command Output ==========================='
116- if (! $__vsts_input_failOnStandardError ) {
117- Invoke-VstsTool @splat
118- }
119- else {
120- $inError = $false
121- $errorLines = New-Object System.Text.StringBuilder
122- Invoke-VstsTool @splat 2>&1 |
123- ForEach-Object {
124- if ($_ -is [System.Management.Automation.ErrorRecord ]) {
125- # Buffer the error lines.
126- $failed = $true
127- $inError = $true
128- $null = $errorLines.AppendLine (" $ ( $_.Exception.Message ) " )
129-
130- # Write to verbose to mitigate if the process hangs.
131- Write-Verbose " STDERR: $ ( $_.Exception.Message ) "
132- } else {
133- # Flush the error buffer.
134- if ($inError ) {
135- $inError = $false
136- $message = $errorLines.ToString ().Trim()
137- $null = $errorLines.Clear ()
138- if ($message ) {
139- Write-VstsTaskError - Message $message
116+ # Run the script.
117+ Write-Host ' ========================== Starting Command Output ==========================='
118+ if (! $__vsts_input_failOnStandardError ) {
119+ Invoke-VstsTool @splat
120+ }
121+ else {
122+ $inError = $false
123+ $errorLines = New-Object System.Text.StringBuilder
124+ Invoke-VstsTool @splat 2>&1 |
125+ ForEach-Object {
126+ if ($_ -is [System.Management.Automation.ErrorRecord ]) {
127+ # Buffer the error lines.
128+ $failed = $true
129+ $inError = $true
130+ $null = $errorLines.AppendLine (" $ ( $_.Exception.Message ) " )
131+
132+ # Write to verbose to mitigate if the process hangs.
133+ Write-Verbose " STDERR: $ ( $_.Exception.Message ) "
134+ } else {
135+ # Flush the error buffer.
136+ if ($inError ) {
137+ $inError = $false
138+ $message = $errorLines.ToString ().Trim()
139+ $null = $errorLines.Clear ()
140+ if ($message ) {
141+ Write-VstsTaskError - Message $message
142+ }
140143 }
141- }
142144
143- Write-Host " $_ "
145+ Write-Host " $_ "
146+ }
144147 }
145- }
146148
147- # Flush the error buffer one last time.
148- if ($inError ) {
149- $inError = $false
150- $message = $errorLines.ToString ().Trim()
151- $null = $errorLines.Clear ()
152- if ($message ) {
153- Write-VstsTaskError - Message $message
149+ # Flush the error buffer one last time.
150+ if ($inError ) {
151+ $inError = $false
152+ $message = $errorLines.ToString ().Trim()
153+ $null = $errorLines.Clear ()
154+ if ($message ) {
155+ Write-VstsTaskError - Message $message
156+ }
154157 }
155158 }
159+
160+ # Fail if any errors.
161+ if ($failed ) {
162+ Write-VstsSetResult - Result ' Failed' - Message " Error detected" - DoNotThrow
163+ }
156164 }
165+ else
166+ {
167+ # Trace the expression as it will be invoked.
168+ $__vstsAzPSInlineScriptPath = $null
169+ If ($scriptType -eq " InlineScript" ) {
170+ $scriptArguments = $null
171+ $__vstsAzPSInlineScriptPath = [System.IO.Path ]::Combine($env: Agent_TempDirectory , ([guid ]::NewGuid().ToString() + " .ps1" ));
172+ ($scriptInline | Out-File $__vstsAzPSInlineScriptPath )
173+ $scriptPath = $__vstsAzPSInlineScriptPath
174+ }
157175
158- # Fail if any errors.
159- if ($failed ) {
160- Write-VstsSetResult - Result ' Failed' - Message " Error detected" - DoNotThrow
176+ $scriptCommand = " & '$ ( $scriptPath.Replace (" '" , " ''" )) ' $scriptArguments "
177+ Remove-Variable - Name scriptType
178+ Remove-Variable - Name scriptPath
179+ Remove-Variable - Name scriptInline
180+ Remove-Variable - Name scriptArguments
181+
182+ # Remove all commands imported from VstsTaskSdk, other than Out-Default.
183+ # Remove all commands imported from VstsAzureHelpers_.
184+ Get-ChildItem - LiteralPath function: |
185+ Where-Object {
186+ ($_.ModuleName -eq ' VstsTaskSdk' -and $_.Name -ne ' Out-Default' ) -or
187+ ($_.Name -eq ' Invoke-VstsTaskScript' ) -or
188+ ($_.ModuleName -eq ' VstsAzureHelpers_' )
189+ } |
190+ Remove-Item
191+
192+ # For compatibility with the legacy handler implementation, set the error action
193+ # preference to continue. An implication of changing the preference to Continue,
194+ # is that Invoke-VstsTaskScript will no longer handle setting the result to failed.
195+ $global :ErrorActionPreference = ' Continue'
196+
197+ # Undocumented VstsTaskSdk variable so Verbose/Debug isn't converted to ##vso[task.debug].
198+ # Otherwise any content the ad-hoc script writes to the verbose pipeline gets dropped by
199+ # the agent when System.Debug is not set.
200+ $global :__vstsNoOverrideVerbose = $true
201+
202+ # Run the user's script. Redirect the error pipeline to the output pipeline to enable
203+ # a couple goals due to compatibility with the legacy handler implementation:
204+ # 1) STDERR from external commands needs to be converted into error records. Piping
205+ # the redirected error output to an intermediate command before it is piped to
206+ # Out-Default will implicitly perform the conversion.
207+ # 2) The task result needs to be set to failed if an error record is encountered.
208+ # As mentioned above, the requirement to handle this is an implication of changing
209+ # the error action preference.
210+ ([scriptblock ]::Create($scriptCommand )) |
211+ ForEach-Object {
212+ Remove-Variable - Name scriptCommand
213+ Write-Host " ##[command]$_ "
214+ . $_ 2>&1
215+ } |
216+ ForEach-Object {
217+ if ($_ -is [System.Management.Automation.ErrorRecord ]) {
218+ if ($_.FullyQualifiedErrorId -eq " NativeCommandError" -or $_.FullyQualifiedErrorId -eq " NativeCommandErrorMessage" ) {
219+ , $_
220+ if ($__vsts_input_failOnStandardError -eq $true ) {
221+ " ##vso[task.complete result=Failed]"
222+ }
223+ }
224+ else {
225+ if ($__vsts_input_errorActionPreference -eq " continue" ) {
226+ , $_
227+ if ($__vsts_input_failOnStandardError -eq $true ) {
228+ " ##vso[task.complete result=Failed]"
229+ }
230+ }
231+ elseif ($__vsts_input_errorActionPreference -eq " stop" ) {
232+ throw $_
233+ }
234+ }
235+ } else {
236+ , $_
237+ }
238+ }
161239 }
240+
162241}
163242finally {
164243 if ($__vstsAzPSInlineScriptPath -and (Test-Path - LiteralPath $__vstsAzPSInlineScriptPath ) ) {
0 commit comments