如何使用 invoke-expression 跳出脚本

How to break out of script using invoke-expression

我有一个像菜单一样工作的 powershell 脚本。做出选择后,它会启动另一个 powershell 脚本。

其他脚本相当大,我在脚本中有很多点需要中止该脚本并 return 返回菜单。

我调用其他脚本使用:

invoke-expression -Command "& '.\script.ps1'"

在脚本本身的不同位置,我使用以下命令跳出脚本。

break script

这很好用,因为它终止了脚本,但它不会 return 之前调用的脚本。

带参数的break命令表示打到一个标签。如果不存在标签,它将跳出整个脚本。但考虑到我目前如何调用脚本,它会将所有内容视为一个大脚本并打破所有内容。

在我的下标中,我将以下内容放在文件末尾:

:End_Of_Script

并使用了 break End_Of_Script 但同样失败了。

所以我的问题归结为: 我怎样才能调用另一个脚本并在任何时候中断该脚本并 return 回到以前的脚本而不改变该脚本的完整结构?

下面是下标的片段:

write-host "1. Choice A"
write-host "2. Choice B"
$choice = read-host "What choice?"

switch ($choice)
1
{
     write-host "The choice is A"
}

2
{
     write-host "The choice is B"
}
default
{
     write-host "Invalid choice"
     break script
}

get-childitem | foreach-object {

    if( $_.Name -like "*test*")
    {
         break script
    }

}

在我的主脚本中,invoke-expression ... 之后的命令从不执行。

您可以使用 exit 来执行此操作。

The exit keyword is best used in functions, and when those functions are called in a script. It's a great way to terminate execution of functions.

参考PowerShell Exit Function & Code Execution | Pluralsight


如果脚本遇到错误需要退出,可以使用throw更好的提示具体的错误原因


可以使用 & $FilePath 调用另一个脚本,invoke-expression -Command "& '$FilePath'" 是一种麻烦且不必要的用法。