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

PowerShell脚本VSCode运行正常,命令行执行提示函数未识别

问题原因及解决方法

核心原因

这是PowerShell的函数定义顺序问题:你在脚本里先调用了getPrinterState函数,却把函数的定义写在了调用代码的后面。PowerShell是逐行执行脚本的,当执行到$state = getPrinterState -ip $ip这一行时,getPrinterState函数还没被定义,自然会提示“未被识别为cmdlet或可执行命令”。

为什么VSCode里能正常运行?因为VSCode的PowerShell扩展会提前预解析整个脚本里的所有函数定义,再执行代码逻辑,所以即使函数写在调用之后也能识别;但原生PowerShell/PowerShell 7(pwsh)是严格按执行顺序处理,不会提前加载后续的函数。

解决方法

把所有函数定义(getPrinterState和ResetPrinter)移到脚本的最开头,确保在调用函数之前,PowerShell已经加载了这些函数。

修正后的示例代码:

# 定义获取打印机状态的函数
function getPrinterState{
    param($ip)

    #Brother sin egen software sjekker 3 verdier - gjør det samme.
    $SNMP.open($ip,'internal',2,1000)
    $RESULT1 = $SNMP.get('.1.3.6.1.4.1.11.2.4.3.1.2.0')
    $RESULT2 = $SNMP.get('.1.3.6.1.2.1.43.16.5.1.2.1.1')
    $RESULT3 = $SNMP.get('.1.3.6.1.4.1.11.2.3.9.1.1.3.0')
    $SNMP.Close()

    #Sjekk om alle verdier er i ERROR 
    if ( ($RESULT1.Trim() -eq 'ERROR') -and ($RESULT2.Trim() -eq 'ERROR') -and ($RESULT3.Trim() -eq "ERROR") ){
        return "ERROR"
    }
    else{
        return "OK"
    }
}

# 定义重置打印机的函数(请补充完整你的ResetPrinter实现)
function ResetPrinter{
    param($ip)
    # 这里添加你的软重置逻辑
}

# 初始化SNMP对象
$SNMP = New-Object -ComObject olePrn.OleSNMP

# 定义打印机IP列表
$printers =  @('10.0.31.108','10.0.31.182')

# 遍历检查每个打印机状态并处理
foreach ($ip in $printers){
    $state = getPrinterState -ip $ip

    if ($state -eq "ERROR"){
        # 执行软重置
        ResetPrinter -ip $ip
    }
}

额外注意

PowerShell 7(pwsh)是跨平台版本,olePrn.OleSNMP这类COM对象仅在Windows系统上可用,确保你是在Windows环境下运行pwsh,否则会遇到COM对象无法创建的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:54:28