SebMa
SebMa

Reputation: 4727

Get argc value in a function inside $PROFILE script file

I have created the following function in my $PROFILE script file :

function host($name, $server, $type) {
    $FUNCNAME = $MyInvocation.MyCommand.Name
    $argc = $args.Count
    if ( $argc -eq 0 ) {
        "=> Usage : $FUNCNAME `$name [`$server] [`$type=A]"
    } elseif ( $argc -eq 1 ) {
        $fqdn = $name -Replace('https?://|s?ftps?://','') -Replace('/.*$','')
        (Resolve-DnsName $fqdn)[0].Name
        (Resolve-DnsName $fqdn).IP4Address
    } elseif ( $argc -eq 2 ) {
        $fqdn = $name -Replace('https?://|s?ftps?://','') -Replace('/.*$','')
        (Resolve-DnsName -name $fqdn -server $server)[0].Name
        (Resolve-DnsName -name $fqdn -server $server).IP4Address
    } elseif ( $argc -eq 3 ) {
        $fqdn = $name -Replace('https?://|s?ftps?://','') -Replace('/.*$','')
        if ( $type -eq "-4" ) {
            $type = "A"
        } elseif ( $type -eq "-6" ) {
            $type = "AAAA"
        } else {
            $type = "A_AAAA"
        }
        (Resolve-DnsName -type $type -name $fqdn -server $server)[0].Name
        (Resolve-DnsName -type $type -name $fqdn -server $server).IP4Address
    } else {
        Write-Warning "=> Not supported for the moment."
    }
}

I tried to fetch the value of argc C equivalent.

So I tried $args.Count but it always return 0 from inside my function.

Can you help me ?

Upvotes: 0

Views: 31

Answers (2)

sirtao
sirtao

Reputation: 2880

As @js2010 said, $args exists only if there is no parameters in the function.

But it's a easy fix: you can simply replace $argc = $args.Count with $argc = $PSBoundParameters.Count

Plus this lets you access named parameters directly, making code easier to write and read:

# Evaluate using a Approved Verbs name
function Get-ResolveDnsName {
    # an alias for easier use in terminal.  
    # I do not suggest to use it in scripts.  
    [Alias('Host')]
    [CmdletBinding(
        # this forces the position of the parameters when not using names
        PositionalBinding = $true, 
        DefaultParameterSetName = 'ZeroParameters'
    )]
    param (
        # By using a default a ParameterSet with NO parameters,
        # we make possible to call the function without parameters while
        # have the $Name being mandatory otherwise
        [Parameter(Position = 1, Mandatory = $true, ParameterSetName = 'Minimum')]
        [string]$Name,
        [Parameter(Position = 2, ParameterSetName = 'Minimum')]
        [string]$Server,
        [Parameter(Position = 3, ParameterSetName = 'Minimum')]
        # let's add some validation given we have a limited set of correct values.  
        [ValidateSet('4', 'A', '6', 'AAAA', 'A_AAAA')]
        [string]$Type
    )
    

    # if no parameter is passed, call self-help and quit the function
    if (-not $PSBoundParameters.Count) { 
        Get-Help $MyInvocation.MyCommand.Name 
        break
    }

    # Let's start making a SPLATtable hastable for the Resolve-DnsName parameters
    $Splat = @{
        # You always have the $Name so let's add it
        Name = $Name -Replace ('https?://|s?ftps?://', '') -Replace ('/.*$', '')
    }


    # let's add the other parameters as necessary
    if ($PSBoundParameters.ContainsKey('Server')) { $Splat['Server'] = $Server }

    if ($PSBoundParameters.ContainsKey('Type')) {
        $Splat['type'] = switch ($Type) {
            # -iin forces case Insensitivity  
            { $_ -iin '4', 'A' } { 'A' }
            { $_ -iin '6', 'AAAA' } { 'AAAA' }
            default { 'A_AAAA' }
        }
    }
    
    # SPLAT!
    Resolve-DnsName @Splat
}

Upvotes: 1

js2010
js2010

Reputation: 27516

That only works if there's no parameters to the function.

function host { $args.count }

host a b c

3

Upvotes: 0

Related Questions