You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:04:53