我试图了解Powershell中的异常处理,更具体地说,如果失败,如何使用for循环重试动作。
我有下面的代码,它捕获异常,但只会尝试for循环的一次迭代。
我在for循环中做错了吗?或者这是catch块的行为不处理循环?
try{
Copy-Item "C:\Path\To\Source.file" "C:\Path\To\Destination.file" -Force -ErrorAction Stop
}
catch{
$e = $_.Exception.GetType().Name
LogWrite $e
if($e -eq 'IOException')
{
for($i=0; $i -lt 6; $i++)
{
LogWrite "Waiting..."
Start-Sleep -s 10
LogWrite "Copying in the file attempt $i"
Copy-Item "C:\Path\To\Source.file" "C:\Path\To\Destination.file" -Force
}
}
}
答案 0 :(得分:2)
您希望将try
/ catch
放在循环结构的中。这是你可能采取的一种方式:
$i = 0
$done = $False
while(-not ($done) -and ($i -lt 6))
{
try{
Copy-Item "C:\Path\To\Source.file" "C:\Path\To\Destination.file" -Force -ErrorAction Stop
$done = $True
}
catch{
$e = $_.Exception.GetType().Name
LogWrite $e
if($e -eq 'IOException')
{
LogWrite "Waiting..."
Start-Sleep -s 10
LogWrite "Copying in the file attempt $i"
$i = $i + 1
}
else
{
$i = 6
}
}
}
在您当前的尝试中,第二个Copy-Item
不包含在try
块中,而catch
块仅捕获在其中发生的异常他们对应的try
。
(如果$i
已达到6,您可能希望在循环后执行某些操作,例如报告您遇到了无法恢复的错误)