PowerShell $PROFILE脚本函数中$args.Count返回0,无法获取参数数量求助
解决PowerShell函数中$args.Count始终为0的问题
你遇到的问题根源在于:函数定义了显式参数($name、$server、$type),PowerShell会自动将传入的参数绑定到这些显式参数上,而$args变量仅用于存储未匹配到任何显式参数的额外参数。因此正常传参时,$args是空的,$args.Count自然返回0。
以下是两种可行的解决方案:
方案1:改用$args接收所有参数(适合位置传参场景)
去掉函数的显式参数定义,直接通过$args数组访问所有传入的参数,此时$args.Count就能正确返回参数总数:
function host { $FUNCNAME = $MyInvocation.MyCommand.Name $argc = $args.Count if ( $argc -eq 0 ) { "=> Usage : $FUNCNAME `$name [`$server] [`$type=A]" } elseif ( $argc -eq 1 ) { $fqdn = $args[0] -Replace('https?://|s?ftps?://','') -Replace('/.*$','') (Resolve-DnsName $fqdn)[0].Name (Resolve-DnsName $fqdn).IP4Address } elseif ( $argc -eq 2 ) { $fqdn = $args[0] -Replace('https?://|s?ftps?://','') -Replace('/.*$','') (Resolve-DnsName -name $fqdn -server $args[1])[0].Name (Resolve-DnsName -name $fqdn -server $args[1]).IP4Address } elseif ( $argc -eq 3 ) { $fqdn = $args[0] -Replace('https?://|s?ftps?://','') -Replace('/.*$','') $type = $args[2] if ( $type -eq "-4" ) { $type = "A" } elseif ( $type -eq "-6" ) { $type = "AAAA" } else { $type = "A_AAAA" } (Resolve-DnsName -type $type -name $fqdn -server $args[1])[0].Name (Resolve-DnsName -type $type -name $fqdn -server $args[1]).IP4Address } else { Write-Warning "=> Not supported for the moment." } }
方案2:保留显式参数,用$PSBoundParameters.Count统计传入参数数
$PSBoundParameters是PowerShell内置的哈希表,会存储所有被用户显式传入值的参数,它的Count属性正好对应你需要的“传入参数总数”,同时还支持参数名传参(如host -name example.com -server 8.8.8.8):
function host($name, $server, $type) { $FUNCNAME = $MyInvocation.MyCommand.Name $argc = $PSBoundParameters.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." } }
内容的提问来源于stack exchange,提问作者SebMa
相关产品推荐
相关产品推荐

