Variable Problem

Welcome Forums General PowerShell Q&A Variable Problem

Viewing 4 reply threads
  • Author
    Posts
    • #189703
      Participant
      Topics: 4
      Replies: 6
      Points: 79
      Rank: Member

      Good morning Powershell people!! I am writing a script that needs to take a wait time parameter and pass it to Start-Sleep. My script works exactly as I expect when I hard code my wait time. The issue I am having is when I declare my parameter in the script and pass a default of 30, I get an error. Here is my declaration section:

      [CmdletBinding()]
      param (
          [Parameter(Mandatory)]
          [String]$Environment,
          [ValidateNotNullOrEmpty]
          [Parameter]
          [Int32]
          $Wait = 30
      
          
      )

      The error I am getting is on initiation of the script. I have googled, but my google-fu is weak today

      : Cannot process argument transformation on parameter 'Wait'. Cannot convert the "30"
      value of type "System.Int32" to type "System.Management.Automation.ParameterAttribute".
    • #189712
      Participant
      Topics: 9
      Replies: 1277
      Points: 1,051
      Helping Hand
      Rank: Community Hero

      Edit: A couple of things.

      • Parameter should have () or it probably would not validate properly. Although params don't need to be strongly declared (e.g. Mandatory=$true), it makes it easier to understand what you are doing.
      • [ValidateNotNullOrEmpty] isn't necessary, you a declaring it as an INT, so you have to pass a valid number to the cmdlet
      • int should be more than sufficient for sleep, no need to do int32
      • The variable should be $WaitInSec or something that tells a user what time measurement is being used. Minimally help provided to ensure they understand it's seconds vs minutes.
      [CmdletBinding()]
      param (
          [Parameter(Mandatory=$true)]
          [string]$Environment,
          [Parameter(Mandatory=$false)]
          [int]$Wait = 30
      )
      
      • #189715
        Participant
        Topics: 4
        Replies: 6
        Points: 79
        Rank: Member

        Rob, Thanks for the quick reply. It didn't change the behavior. Here's the output:

        PS C:\WINDOWS\system32> [CmdletBinding()]
        >> param (
        >> [Parameter(Mandatory='False')]
        >> [String]$Environment,
        >> [ValidateNotNullOrEmpty]
        >> [Int]$Wait = 30
        >> )
        
        cmdlet  at command pipeline position 1
        Supply values for the following parameters:
        Environment: TEST
        Cannot process argument transformation on parameter 'Wait'. Cannot convert the "30" value of type "System.Int32" to type "System.Management.Automation.ValidateNotNullOrEmptyAttribute".
            + CategoryInfo          : InvalidData: (:) [], ParentContainsErrorRecordException
            + FullyQualifiedErrorId : ParameterArgumentTransformationError
        
        
    • #189718
      Participant
      Topics: 4
      Replies: 6
      Points: 79
      Rank: Member

      Good points. Let me implement and see if that fixes the issue I am seeing. The reason I used [ValidateNotNullOrEmpty] is so I can pass the default of 30 seconds if the user doesn't specify a wait time.

    • #189727
      Participant
      Topics: 9
      Replies: 1277
      Points: 1,051
      Helping Hand
      Rank: Community Hero

      You are setting a default value, so if a user does not pass a value it will use that. If a user does pass a value, it has to validate to be a numeric number in the int range.

      function Test-It {
      [CmdletBinding()]
      param (
          [Parameter(Mandatory=$true)]
          [string]$Environment,
          [Parameter(Mandatory=$false)]
          [int]$Wait = 30
      )
      
          'Waiting {0} seconds for environment {1}' -f $Wait, $Environment
      
      }
      
      Test-It -Environment Alpha
      

      Output:

      PS C:\Users\rasim> Test-It -Environment Alpha
      
      Waiting 30 seconds for environment Alpha
      
      PS C:\Users\rasim> Test-It -Environment Bravo -Wait 3
      Waiting 3 seconds for environment Bravo
      
      PS C:\Users\rasim> Test-It -Environment Bravo -Wait 
      Test-It : Missing an argument for parameter 'Wait'. Specify a parameter of type 'System.Int32' and try again.
      At line:1 char:28
      + Test-It -Environment Bravo -Wait
      +                            ~~~~~
          + CategoryInfo          : InvalidArgument: (:) [Test-It], ParameterBindingException
          + FullyQualifiedErrorId : MissingArgument,Test-It
       
      
      PS C:\Users\rasim> 
      
    • #189745
      Participant
      Topics: 4
      Replies: 6
      Points: 79
      Rank: Member

      It was the [Validatenotnullorempty] that was causing the problem. I modified it to what you have and no issue. Thanks.

Viewing 4 reply threads
  • You must be logged in to reply to this topic.