- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
执行这样的脚本时:
nonexistingcommand
echo "Hello"
我得到:
nonexistingcommand : The term 'nonexistingcommand' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the
name, or if a path was included, verify that the path is correct and try again.
At D:\Playground\powershell\Test.ps1:2 char:1
+ nonexistingcommand
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonexistingcommand:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Hello
因此,CommandNotFoundException
似乎是一个非终止错误。那么为什么如果我
try {
nonexistingcommand
}
catch [System.Management.Automation.CommandNotFoundException] {
throw
}
echo "Hello"
在这种情况下,它将退出并且不打印“Hello”。
这是为什么?
最佳答案
不幸的是,PowerShell 有两种类型的终止错误:
语句终止错误,默认情况下仅终止封闭的语句。
默认情况下,执行继续,即使用下一个语句(在您的情况下echo "Hello"
)
CommandNotFoundException
就是此类错误的一个实例。
相比之下,如果有进一步的管道输入可用(例如,Get-ChildItem NoSuchDir,\
对于不存在的目录发出非终止错误。NoSuchDir
,然后继续成功报告现有目录。\
)
脚本终止(线程终止)错误,该错误会终止封闭的脚本和整个调用堆栈。
throw
statement 触发的从 PowerShell 代码调用,而不是二进制(编译的)cmdlet。try { ... } catch { ... } finally { ... }
statement 不区分这两种子类型:它捕获它们两者。
catch
block 包含无参数 throw
语句,该语句隐式中继触发错误的错误,因此您实际上正在转变语句-脚本中的终止错误-终止脚本,因此执行在此结束。同样,设置 $ErrorActionPreference
preference variable 'Stop'
会导致所有类型的错误(由PowerShell命令[1]发出),包括>非终止的,中止整体执行;换句话说:非终止和语句终止错误都会提升为脚本终止错误。
有关 PowerShell 极其复杂的错误处理的全面概述,请参阅 GitHub docs issue #1583 .
[1] 至少在控制台(终端)中外部程序的本地前台调用中,默认情况下stderr输出不是 通过 PowerShell 的错误流路由,因此不受 $ErrorActionPreference
影响。
但是,在 PowerShell v7.1 及更低版本(包括 Windows PowerShell)中,使用 2>
重定向确实通过 PowerShell 的错误流路由 stderr,这可能会产生意外的副作用。此问题将在 v7.2 中修复。
请注意,该行为是 PowerShell 特定于主机的行为,并且适用于主机 ConsoleHost
(使用 $host
获取主机信息)。 其他主机仍然总是通过错误流路由stderr,这显着影响远程处理和后台作业。
关于Powershell CommandNotFoundException 正在终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69276210/
我正在寻找实现 PowerShell 提供程序 在 电源外壳。 我一直在想,如果我只是定义类型,然后将它们导入我的 session (导入模块),我应该能够让它们可用。 例如,这个 不工作但它沿着我想
我创建的脚本使用了组件,这些组件仅在32位版本的Powershell中可用。 默认情况下,Windows使用Powershell x64执行脚本,这会导致一些错误。 是一种在脚本开头设置值以强制Win
是否可以从 Powershell 中检测它是否是嵌套 shell? 如果我打开 Powershell 或 cmd.exe 窗口,然后输入 powershell 在那里,是否有一个神奇的 $host.s
随着 PowerShell Core 的发布,应用程序在使用托管自动化库 (system.management.automation) 时如何选择调用哪个版本的 Powershell(Powershe
最近,我加入了我企业的 Windows 团队,凭借我的开发人员背景(一般是 Java、.NET 和 Web),我很快就对 PowerShell 产生了兴趣。我可以看到它比普通的旧批处理文件、VB 更有
假设我有一个 powershell 脚本,它在我当前路径的相对路径中包含一个 Powershell 哈希。让我们称之为“name.ps1”,它包含: $names = @{ "bob" = "b
我想为我正在构建的自定义 Powershell Commandlet 使用 SqlServerCmdletSnapin。如果我将以下代码添加到 PSM1 的开头: if ( (Get-PSSnapin
如何调用从 PowerShell 脚本中获取命名参数的 PowerShell 脚本? foo.ps1: param( [Parameter(Mandatory=$true)][String]$a=''
我即将为 Windows 管理员编写一个 PowerShell 脚本,以帮助他们完成与部署 Web 应用程序相关的某些任务。 有什么理由让我应该赞成或排除开发 PowerShell 模块 (.psm1
我的 powershell 模块有一个函数,我希望它返回一个非零退出代码。但是,作为一个模块函数,当我运行 Import-Module 时,它会加载到 powershell 控制台的上下文中。所以,当
我在这个问题上花了最后 4 个小时,非常感谢您提供的任何意见。 我需要使用不同的凭据调用 powershell 脚本并将参数传递给该脚本。 安装 WISEScript 中包装的程序后,此脚本开始收集机
我有一个场景,我需要将 powershell 命令的命令和输出转发到另一个进程以进行日志记录和处理。 我希望这个控制台尽可能接近 powershell,因此不希望将它简单地托管在另一个控制台程序中。
我正在尝试让一个主 PowerShell 脚本运行所有其他脚本,同时等待 30-60 秒以确保完成任务。我尝试过的所有其他操作都不会停止/等待第一个脚本及其进程完成,然后才能同时完成所有其他脚本,并且
我正在编写一个脚本来使用多个 plink (PuTTY) session 作为 Windows 版本的 clustersh。然而,我陷入困境,因为我想从 powershell 打开多个 Powersh
我读了这个答案:How to Open Powershell from Powershell start powershell 这将打开基础的大分辨率 PS 实例。如何打开 PS(x86)? 最佳答案
我很想知道我们是否可以在 Powershell 中做到这一点。 使用 Out-File 命令,我们可以通过管道将其输出写入文件。这样我就可以将我所有的历史命令发送到一个文本文件中。 问题是我可以在每次
我在 about_Pipelines 阅读了有关 PowerShell 中的管道工作原理的信息,并了解到管道一次传送一个对象。 所以,这个 Get-Service | Format-Table -Pr
我正在尝试像这样从 powershell 启动一个进程:- $proc = (start-process $myExe -argumentList '/myArg True' -windowStyle
## To run the script # .\get_status.ps1 -Hostname -Service_Action -Service_Name #$Hostname = "hos
让我们使用 powershell 命令 Write-Host "red text"-Fore red这会在红色前景中显示“红色文本”。 但是,您希望文本以稍微亮一点的方式显示字体颜色,浅红色。 有没有
我是一名优秀的程序员,十分优秀!