Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何防止外部脚本使用break语句终止脚本_Powershell - Fatal编程技术网

Powershell 如何防止外部脚本使用break语句终止脚本

Powershell 如何防止外部脚本使用break语句终止脚本,powershell,Powershell,我正在调用一个外部.ps1文件,该文件在某些错误情况下包含break语句。我想以某种方式捕捉这个场景,允许任何外部打印的消息正常显示,并在脚本中继续后续语句。如果外部脚本有一个抛出,使用try/catch可以很好地工作。即使文件中有trap,我也无法阻止脚本终止 为了回答这个问题,假设外部.ps1文件(由其他人编写并在运行时拉入)的源代码无法更改 我想要的是可能的,还是脚本的作者只是不想在外部调用时表现得很好 编辑:提供以下示例 在badscript.ps1中: if((Get-Date).Da

我正在调用一个外部.ps1文件,该文件在某些错误情况下包含
break
语句。我想以某种方式捕捉这个场景,允许任何外部打印的消息正常显示,并在脚本中继续后续语句。如果外部脚本有一个
抛出
,使用
try
/
catch
可以很好地工作。即使文件中有
trap
,我也无法阻止脚本终止

为了回答这个问题,假设外部.ps1文件(由其他人编写并在运行时拉入)的源代码无法更改

我想要的是可能的,还是脚本的作者只是不想在外部调用时表现得很好

编辑:提供以下示例

在badscript.ps1中:

if((Get-Date).DayOfWeek -ne "Yesterday"){
    Write-Warning "Sorry, you can only run this script yesterday."
    break
}
.\badscript.ps1
Write-Host "It is today."
在myscript.ps1中:

if((Get-Date).DayOfWeek -ne "Yesterday"){
    Write-Warning "Sorry, you can only run this script yesterday."
    break
}
.\badscript.ps1
Write-Host "It is today."
我希望得到的结果是看到badscript.ps1中的警告,并继续我在myscript.ps1中的进一步声明。我理解为什么break语句导致“It is today.”永远不会被打印出来,但是我想找到一种解决方法,因为我不是badscript.ps1的作者


编辑:将标题从“powershell try/catch不捕获中断语句”更新为“如何防止外部脚本使用中断语句终止脚本”。提到try/catch实际上更多的是关于实际问题的一个失败的解决方案,新标题更好地反映了这一点。

在我的脚本中运行一个单独的PowerShell进程来调用外部文件,这是一个足以满足我需要的解决方案:
powershell-File.\badscript.ps1
将执行badscript.ps1的内容,直到
break
语句(包括任何写入主机或写入警告),然后让我自己的脚本继续执行。

我知道你的来历。最简单的方法可能是将脚本作为作业推送,然后等待结果。如果需要,您甚至可以在完成接收作业后使用Receive Job将结果回显出来

因此,考虑到上面的错误脚本,以及调用它的脚本文件:

$path = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent

$start = Start-Job -ScriptBlock { . "$using:Path\badScript.ps1" } -Name "BadScript"

$wait = Wait-Job -Name "BadScript" -Timeout 100
Receive-Job -Name "BadScript"
Get-Command -Name "Get-ChildItem"
这将在作业中执行错误脚本,等待结果,回显结果,然后继续执行它所在的脚本

这可以封装在一个函数中,用于您可能需要调用的任何脚本(为了安全起见)

以下是输出:

WARNING: Sorry, you can only run this script yesterday.

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-ChildItem                                      3.1.0.0    Microsoft.PowerShell.Management
上面说

PowerShell不限制标签可以恢复执行的距离 标签甚至可以通过脚本和函数调用传递控制 边界

这让我想到,“我如何才能欺骗这个愚蠢的语言设计选择?”。答案是创建一个小的
开关
块,它将在退出时捕获
中断

。淘气的break.ps1

Write-Host "NaughtyBreak about to break"
break
.\OuterScript.ps1

switch ('dummy') { default {.\NaughtyBreak.ps1}}

Write-Host "After switch() {NaughtyBreak}"

.\NaughtyBreak.ps1

Write-Host "After plain NaughtyBreak"
然后当我们调用OuterScript.ps1时,我们得到

淘气鬼即将崩溃
在switch()之后{nauttybreak}
淘气鬼就要崩溃了

请注意,OuterScript.ps1在调用交换机中嵌入的NoutyBreak.ps1后正确恢复,但在直接调用NoutyBreak.ps1时被意外终止。

将中断放回它所属的循环(包括交换机)中

foreach($i in 1) { ./badscript.ps1 } 
'done'


break
不会触发错误,不会。如果
break
语句仅在脚本中抛出错误的条件下调用,则可以设置
$ErrorActionPreference='Stop'
catch
用于异常,因为
throw
break
与此无关。你的问题没有意义/@EJP这个问题的重点是,是否有一种机制可以让我在捕获异常时获得类似的结果。对我来说很有意义:如何让外部脚本调用不停止脚本的执行?@MathiasR.Jessen不幸的是,一些break语句是在非-错误的条件语句,所以也许我称它们为“错误条件”不够精确。此外,我不想全局强制所有其他脚本非终止错误变为终止错误,因为它可以优雅地处理一些错误。如果您包括一些您现在拥有的示例,那么这个问题可能更有意义,这样我们就可以看到您正试图解决的问题。这个问题似乎不清楚,并且注释正在尝试解决o澄清这一点。虽然开始作业|等待作业与我对需要同步的内容的回答相比要复杂一点,但我真的很感激这一个完全留在commandlets中!哈哈,聪明。从其他语言的经验来看,我从未想到break语句会影响另一个fil中的流结构e/功能:)我也不知道,直到你的问题。我知道您调用的脚本可以继承第一个脚本的变量。但是它们都有自己的作用域。顺便说一句,如果badscript作者“聪明”并积极尝试终止调用方脚本,这将不起作用:如果他们使用不存在的标签限定
break
,调用方脚本将始终终止。当然,调用方脚本的作者可以检查badscript,并确保对它的调用包含所需的带标签的循环/开关,以避免出现这种情况。如果顽皮破解.ps1已
中断不存在的\u标签
,它将终止调用方脚本。(显然,只有在淘气小说作者有意的情况下,这种情况才会发生。)@Silvar Good catch。这似乎是一个安全问题。假设NoutyBreak.ps1知道调用方脚本有一个特定的封闭标签。然后,它可以中断对该标签的执行,而外部脚本无法阻止它。看起来很不对。