Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG]: Powershell@2 task ShowWarnings and non-empty VerbosePreference results in $VerbosePreference being a string in Inline Scripts #20804

Open
4 of 7 tasks
Pxtl opened this issue Jan 23, 2025 · 0 comments

Comments

@Pxtl
Copy link

Pxtl commented Jan 23, 2025

New issue checklist

Task name

Powershell@2

Task version

2.230.0

Issue Description

When both ShowWarnings is enabled, the value of $VerbosePreference is a string and not a proper enum value.

A common powershell pattern is to call a function with -Verbose:$VerbosePreference to prevent verbosity from disappearing as we cross a barrier into another script or function.

Because of this combination, the following error is produced:

System.Management.Automation.ParameterBindingException: Cannot convert 'System.String' to the 
type 'System.Management.Automation.SwitchParameter' required by parameter 'Verbose'. 

This normally works because Powershell silently converts the [Management.Automation.ActionPreference] into a [SwitchParameter] or something like it.

So, this works:

$VerbosePreference = 'continue'
"hello, world" | Set-Content c:\temp\example.txt -Verbose:$VerbosePreference

yielding the verbose message

VERBOSE: Performing the operation "Set Content" on target "Path: C:\temp\example.txt".

Unfortunately, when ShowWarnings is enabled, the inline script is run inside of an invoke-command.

And in this case the auto-conversion fails.

So,

Invoke-Command {
  $VerbosePreference = 'continue'
  "hello, world" | Set-Content c:\temp\example.txt -Verbose:$VerbosePreference
}

yields

Invoke-Command : Cannot convert 'System.String' to the type 'System.Management.Automation.SwitchParameter' required by parameter 'Verbose'.
At line:1 char:1
+ Invoke-Command {
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand

Environment type (Please select at least one enviroment where you face this issue)

  • Self-Hosted
  • Microsoft Hosted
  • VMSS Pool
  • Container

Azure DevOps Server type

Azure DevOps Server (Please specify exact version in the textbox below)

Azure DevOps Server Version (if applicable)

Version Azure DevOps Server 2022.0.1 (AzureDevOpsServer_20231109.3)

Operation system

Windows 10

Relevant log output

========================== Starting Command Output ===========================
##[debug]Entering Invoke-VstsTool.
##[debug] Arguments: '-NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'C:\AgentPools\Default\Agent1\_work\_temp\05ee7bb2-71dd-4c03-84a9-87147d3667b5.ps1'"'
##[debug] FileName: 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
##[debug] WorkingDirectory: 'C:\AgentPools\Default\Agent1\_work\515\s'
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'C:\AgentPools\Default\Agent1\_work\_temp\05ee7bb2-71dd-4c03-84a9-87147d3667b5.ps1'"

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
1      8ad7873a-1cd...                 NotStarted    False                                ...                      
##[debug]STDERR: Invoke-Command : Cannot convert 'System.String' to the type 'System.Management.Automation.SwitchParameter' required by 
##[debug]STDERR: parameter 'Verbose'. 
##[debug]STDERR: At C:\AgentPools\Default\Agent1\_work\_temp\05ee7bb2-71dd-4c03-84a9-87147d3667b5.ps1:10 char:13
##[debug]STDERR: +             Invoke-Command {$ErrorActionPreference = 'stop'
##[debug]STDERR: +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
##[debug]STDERR:     + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
##[debug]STDERR:     + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand
##[debug]STDERR:  
##[error]Invoke-Command : Cannot convert 'System.String' to the type 'System.Management.Automation.SwitchParameter' required by 
parameter 'Verbose'. 
At C:\AgentPools\Default\Agent1\_work\_temp\05ee7bb2-71dd-4c03-84a9-87147d3667b5.ps1:10 char:13
+             Invoke-Command {$ErrorActionPreference = 'stop'
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand
##[debug]Processed: ##vso[task.logissue type=error]Invoke-Command : Cannot convert 'System.String' to the type 'System.Management.Automation.SwitchParameter' required by 
parameter 'Verbose'. 
At C:\AgentPools\Default\Agent1\_work\_temp\05ee7bb2-71dd-4c03-84a9-87147d3667b5.ps1:10 char:13
+             Invoke-Command {$ErrorActionPreference = 'stop'
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand


##[debug]Exit code: 0
##[debug]Leaving Invoke-VstsTool.

Full task logs with system.debug enabled

2025-01-23T00:02:52.3983081Z ##[debug]Evaluating condition for step: 'Proof of failure'
2025-01-23T00:02:52.3984551Z ##[debug]Evaluating: SucceededNode()
2025-01-23T00:02:52.3984745Z ##[debug]Evaluating SucceededNode:
2025-01-23T00:02:52.3985179Z ##[debug]=> True
2025-01-23T00:02:52.3985403Z ##[debug]Result: True
2025-01-23T00:02:52.3985627Z ##[section]Starting: Proof of failure
2025-01-23T00:02:52.4164315Z ==============================================================================
2025-01-23T00:02:52.4164666Z Task         : PowerShell
2025-01-23T00:02:52.4164708Z Description  : Run a PowerShell script on Linux, macOS, or Windows
2025-01-23T00:02:52.4164781Z Version      : 2.230.0
2025-01-23T00:02:52.4164824Z Author       : Microsoft Corporation
2025-01-23T00:02:52.4164873Z Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/powershell
2025-01-23T00:02:52.4164967Z ==============================================================================
2025-01-23T00:02:53.4773282Z ##[debug]VstsTaskSdk 0.11.0 commit 7ff27a3e0bdd6f7b06690ae5f5b63cb84d0f23f4
2025-01-23T00:02:53.8478595Z ##[debug]Entering C:\AgentPools\Default\Agent1\_work\_tasks\PowerShell_e213ff0f-5d5c-4791-802d-52ea3e7be1f1\2.230.0\powershell.ps1.
2025-01-23T00:02:53.9247970Z ##[debug]Loading resource strings from: C:\AgentPools\Default\Agent1\_work\_tasks\PowerShell_e213ff0f-5d5c-4791-802d-52ea3e7be1f1\2.230.0\task.json
2025-01-23T00:02:53.9549304Z ##[debug]Loaded 14 strings.
2025-01-23T00:02:53.9632605Z ##[debug]SYSTEM_CULTURE: 'en-US'
2025-01-23T00:02:53.9712583Z ##[debug]Loading resource strings from: C:\AgentPools\Default\Agent1\_work\_tasks\PowerShell_e213ff0f-5d5c-4791-802d-52ea3e7be1f1\2.230.0\Strings\resources.resjson\en-US\resources.resjson
2025-01-23T00:02:54.0329910Z ##[debug]Loaded 14 strings.
2025-01-23T00:02:54.0578816Z ##[debug]INPUT_ERRORACTIONPREFERENCE: 'stop'
2025-01-23T00:02:54.0685071Z ##[debug]INPUT_WARNINGPREFERENCE: 'default'
2025-01-23T00:02:54.0750762Z ##[debug]INPUT_INFORMATIONPREFERENCE: 'default'
2025-01-23T00:02:54.0818027Z ##[debug]INPUT_VERBOSEPREFERENCE: 'continue'
2025-01-23T00:02:54.0890507Z ##[debug]INPUT_DEBUGPREFERENCE: 'default'
2025-01-23T00:02:54.0996638Z ##[debug]INPUT_PROGRESSPREFERENCE: 'silentlyContinue'
2025-01-23T00:02:54.1048791Z ##[debug]INPUT_SHOWWARNINGS: 'true'
2025-01-23T00:02:54.1113813Z ##[debug] Converted to bool: True
2025-01-23T00:02:54.1181129Z ##[debug]INPUT_FAILONSTDERR: 'true'
2025-01-23T00:02:54.1246018Z ##[debug] Converted to bool: True
2025-01-23T00:02:54.1318003Z ##[debug]INPUT_IGNORELASTEXITCODE: 'false'
2025-01-23T00:02:54.1372051Z ##[debug] Converted to bool: False
2025-01-23T00:02:54.1449183Z ##[debug]INPUT_PWSH: 'false'
2025-01-23T00:02:54.1491195Z ##[debug] Converted to bool: False
2025-01-23T00:02:54.1555927Z ##[debug]INPUT_WORKINGDIRECTORY: 'C:\AgentPools\Default\Agent1\_work\515\s'
2025-01-23T00:02:54.1719572Z ##[debug]Asserting container path exists: 'C:\AgentPools\Default\Agent1\_work\515\s'
2025-01-23T00:02:54.1788597Z ##[debug]INPUT_TARGETTYPE: 'inline'
2025-01-23T00:02:54.1864981Z ##[debug]INPUT_SCRIPT: '"hello, world" | Set-Content .\example.txt -Verbose:$VerbosePreference
2025-01-23T00:02:54.1895603Z ##[debug]Get-Content .\example.txt'
2025-01-23T00:02:54.1960022Z ##[debug]INPUT_RUNSCRIPTINSEPARATESCOPE: 'false'
2025-01-23T00:02:54.2005556Z ##[debug] Converted to bool: False
2025-01-23T00:02:54.2061325Z Generating script.
2025-01-23T00:02:54.2245554Z ##[debug]AGENT_VERSION: '3.225.0'
2025-01-23T00:02:54.2359462Z ##[debug]AGENT_TEMPDIRECTORY: 'C:\AgentPools\Default\Agent1\_work\_temp'
2025-01-23T00:02:54.2413451Z ##[debug]Asserting container path exists: 'C:\AgentPools\Default\Agent1\_work\_temp'
2025-01-23T00:02:54.2633156Z ##[debug]Asserting leaf path exists: 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
2025-01-23T00:02:54.2752109Z ========================== Starting Command Output ===========================
2025-01-23T00:02:54.3411794Z ##[debug]Entering Invoke-VstsTool.
2025-01-23T00:02:54.3594267Z ##[debug] Arguments: '-NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'C:\AgentPools\Default\Agent1\_work\_temp\05ee7bb2-71dd-4c03-84a9-87147d3667b5.ps1'"'
2025-01-23T00:02:54.3663262Z ##[debug] FileName: 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
2025-01-23T00:02:54.3720363Z ##[debug] WorkingDirectory: 'C:\AgentPools\Default\Agent1\_work\515\s'
2025-01-23T00:02:54.3782065Z ##[command]"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'C:\AgentPools\Default\Agent1\_work\_temp\05ee7bb2-71dd-4c03-84a9-87147d3667b5.ps1'"
2025-01-23T00:02:54.7656128Z 
2025-01-23T00:02:54.7664717Z Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
2025-01-23T00:02:54.7676896Z --     ----            -------------   -----         -----------     --------             -------                  
2025-01-23T00:02:54.7686306Z 1      8ad7873a-1cd...                 NotStarted    False                                ...                      
2025-01-23T00:02:55.0819653Z ##[debug]STDERR: Invoke-Command : Cannot convert 'System.String' to the type 'System.Management.Automation.SwitchParameter' required by 
2025-01-23T00:02:55.0867685Z ##[debug]STDERR: parameter 'Verbose'. 
2025-01-23T00:02:55.0915586Z ##[debug]STDERR: At C:\AgentPools\Default\Agent1\_work\_temp\05ee7bb2-71dd-4c03-84a9-87147d3667b5.ps1:10 char:13
2025-01-23T00:02:55.0962155Z ##[debug]STDERR: +             Invoke-Command {$ErrorActionPreference = 'stop'
2025-01-23T00:02:55.1005616Z ##[debug]STDERR: +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2025-01-23T00:02:55.1049795Z ##[debug]STDERR:     + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
2025-01-23T00:02:55.1095565Z ##[debug]STDERR:     + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand
2025-01-23T00:02:55.1137484Z ##[debug]STDERR:  
2025-01-23T00:02:55.1401802Z ##[error]Invoke-Command : Cannot convert 'System.String' to the type 'System.Management.Automation.SwitchParameter' required by 
parameter 'Verbose'. 
At C:\AgentPools\Default\Agent1\_work\_temp\05ee7bb2-71dd-4c03-84a9-87147d3667b5.ps1:10 char:13
+             Invoke-Command {$ErrorActionPreference = 'stop'
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand
2025-01-23T00:02:55.1410530Z ##[debug]Processed: ##vso[task.logissue type=error]Invoke-Command : Cannot convert 'System.String' to the type 'System.Management.Automation.SwitchParameter' required by 
parameter 'Verbose'. 
At C:\AgentPools\Default\Agent1\_work\_temp\05ee7bb2-71dd-4c03-84a9-87147d3667b5.ps1:10 char:13
+             Invoke-Command {$ErrorActionPreference = 'stop'
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand
2025-01-23T00:02:55.1411121Z 
2025-01-23T00:02:55.1415356Z 
2025-01-23T00:02:55.1430803Z ##[debug]Exit code: 0
2025-01-23T00:02:55.1497220Z ##[debug]Leaving Invoke-VstsTool.
2025-01-23T00:02:55.1614470Z ##[debug]Processed: ##vso[task.complete result=Failed]Error detected
2025-01-23T00:02:55.1651779Z ##[debug]Leaving C:\AgentPools\Default\Agent1\_work\_tasks\PowerShell_e213ff0f-5d5c-4791-802d-52ea3e7be1f1\2.230.0\powershell.ps1.
2025-01-23T00:02:55.1935690Z ##[section]Finishing: Proof of failure

Repro steps

aside: since the log does not include it, our build server has PS version 5.1.17763.6640

Task config in pipeline:

          - task: Powershell@2
            displayName: Proof of failure
            inputs:
              targetType: inline
              showWarnings: true
              failOnStderr: true
              VerbosePreference: continue
              script: |
                "hello, world" | Set-Content .\example.txt -Verbose:$VerbosePreference
                Get-Content .\example.txt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant