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

如何无需拆分文件,在PowerShell中测试函数且不执行主逻辑?

在PowerShell中实现类似Python if __name__ == '__main__': 的逻辑,避免导入脚本时执行主功能

核心解决思路

PowerShell没有直接对应Python的__name__变量,但可以通过自动变量$MyInvocation来判断脚本的调用方式:

  • 直接运行脚本时,$MyInvocation.InvocationName是脚本文件名(比如.\script.ps1),或者$MyInvocation.ScriptName会和$PSCommandPath(当前脚本完整路径)完全一致
  • 当脚本被导入(比如Pester的BeforeAll里用.点源)时,$MyInvocation.InvocationName会是.(点运算符),或者$MyInvocation.ScriptName和$PSCommandPath不相等

利用这个差异,就能把主功能代码限制在仅直接运行脚本时执行。

改造你的script.ps1

把主功能代码放到判断逻辑里,这样被Pester导入时就不会触发:

# script.ps1
function functionA {
    param($inputVal)
    return $inputVal * 2
}

function functionB {
    param($inputVal)
    return $inputVal + 10
}

# 类似Python的if __name__ == '__main__'逻辑
if ($MyInvocation.ScriptName -eq $PSCommandPath) {
    # 只有直接运行脚本时才执行这部分主功能
    function mainFunctionality {
        $aResult = functionA 5
        $bResult = functionB $aResult
        Write-Host "最终结果: $bResult"
    }
    mainFunctionality
}

如果需要兼容PowerShell 2.0,也可以用另一种判断方式:

if ($MyInvocation.InvocationName -ne '.') {
    # 主功能代码
    function mainFunctionality {
        # ... 逻辑不变
    }
    mainFunctionality
}

Pester测试脚本示例

现在写测试文件script.Tests.ps1,导入脚本时不会执行主功能:

BeforeAll {
    # 导入脚本,此时不会触发mainFunctionality
    . $PSScriptRoot/script.ps1
}

Describe "测试functionA" {
    It "输入5应该返回10" {
        functionA 5 | Should -Be 10
    }

    It "输入0应该返回0" {
        functionA 0 | Should -Be 0
    }
}

Describe "测试functionB" {
    It "输入10应该返回20" {
        functionB 10 | Should -Be 20
    }

    It "输入-5应该返回5" {
        functionB -5 | Should -Be 5
    }
}

效果说明

  • 直接运行.\script.ps1:正常执行mainFunctionality输出结果
  • 运行Pester测试:脚本被导入,仅加载functionA和functionB,不会执行主功能,顺利完成测试

内容的提问来源于stack exchange,提问作者successhawk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:35:22