继续执行异常
Posted
技术标签:
【中文标题】继续执行异常【英文标题】:Continue execution on Exception 【发布时间】:2013-04-26 05:51:21 【问题描述】:下面是我要执行的脚本。这里的问题是一旦发生异常就会停止执行,我在 catch 块中使用了continue
,但这不起作用。即使在发生异常后它应该在foreach
中循环,我如何让它工作。
我也使用了while($true)
循环,但它进入了无限循环。该怎么办?
$ErrorActionPreference = "Stop";
try
# Loop through each of the users in the site
foreach($user in $users)
# Create an array that will be used to split the user name from the domain/membership provider
$a=@()
$displayname = $user.DisplayName
$userlogin = $user.UserLogin
# Separate the user name from the domain/membership provider
if($userlogin.Contains('\'))
$a = $userlogin.split("\")
$username = $a[1]
elseif($userlogin.Contains(':'))
$a = $userlogin.split(":")
$username = $a[1]
# Create the new username based on the given input
$newalias = $newprovider + "\" + $username
if (-not $convert)
$answer = Read-Host "Your first user will be changed from $userlogin to $newalias. Would you like to continue processing all users? [Y]es, [N]o"
switch ($answer)
"Y" $convert = $true
"y" $convert = $true
default exit
if(($userlogin -like "$oldprovider*") -and $convert)
LogWrite ("Migrating User old : " + $user + " New user : " + $newalias + " ")
move-spuser -identity $user -newalias $newalias -ignoresid -Confirm:$false
LogWrite ("Done")
catch
LogWrite ("Caught the exception")
LogWrite ($Error[0].Exception)
【问题讨论】:
为什么不改变$ErrorActionPreference = "Continue"
?不适合你?
是否存在导致异常的特定行?
【参考方案1】:
当您想要处理错误时,您可以使用try ... catch ...
。如果你想忽略它们,你应该将$ErrorActionPreference = "Continue"
(或"SilentlyContinue"
)设置为@C.B。建议,或使用-ErrorAction "SilentlyContinue"
进行引发错误的特定操作。如果你想处理某个指令的错误,你应该把那个指令放在try ... catch ...
块中,而不是整个循环,例如:
foreach($user in $users)
...
try
if(($userlogin -like "$oldprovider*") -and $convert)
LogWrite ("Migrating User old : " + $user + " New user : " + $newalias + " ")
move-spuser -identity $user -newalias $newalias -ignoresid -Confirm:$false
LogWrite ("Done")
catch
LogWrite ("Caught the exception")
LogWrite ($Error[0].Exception)
【讨论】:
因为我想记录非终止错误,设置 '$ErrorActionPreference' 对我没有多大帮助。它工作的唯一时间是 '$ErrorActionPreference = "Stop"' 但执行在 catch 时停止。即使出现错误,我也想继续执行。请看我的回答,解决了我的问题。感谢您的回答。 :) 您需要Stop
作为try..catch
工作的错误操作,因为它只捕获终止错误。如果没有终止错误,一开始就没有什么可以捕捉到的。
-ErrorAction 不适用于异常。例如。如果你想忽略 Set-ExecutionPolicy 的失败,唯一没有错误输出的方法是 Catch[System...] 。请注意,您需要空间,否则 Catch 将被解析为空并导致错误!【参考方案2】:
您似乎已将“catch”放在循环主体之外,因此中止了循环。将 catch 放入循环中
【讨论】:
请提供更多解释和代码,因为这些可能有助于将来参考 在 OP 代码中,catch 块位于循环之外。下面是一个例子: foreach($a in $list) try dosomething Write-Output "Yay, I did something!" Catch 写输出“呃,哦。世界末日。” 当异常被捕获时,在循环外被捕获。【参考方案3】:修改代码如下。在move-spuser -identity $user -newalias $newalias -ignoresid -Confirm:$false
之后使用了下面这段代码
if($?)
LogWrite ("Done!")
LogWrite (" ")
else
LogWrite ($Error[0].ToString())
LogWrite (" ")
【讨论】:
不要使用$?
。曾经。而是检查$LastExitCode
(请参阅here)。
$LastExitCode 不是用于可执行文件,而不是用于 PowerShell cmdlet、脚本或函数吗?【参考方案4】:
对我有用的方法是将 $ErrorActionPreference
变量设置为停止,然后将其重置为在 catch 块中继续:
$e = $ErrorActionPreference
$ErrorActionPreference="stop"
try
#Do Something that throws the exception
catch
$ErrorActionPreference=$e
$ErrorActionPreference=$e;
【讨论】:
以上是关于继续执行异常的主要内容,如果未能解决你的问题,请参考以下文章