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
相关产品推荐
相关产品推荐

