Powershell脚本重试移动项,直到成功失败

时间:2019-05-09 21:49:57

标签: powershell

我编写了以下循环,如果尝试重命名文件失败,则将休眠5秒,但是,当事件日志报告失败($?为假)时,它不会重试,而是继续执行下一个程序块代码:

DO
{
    Move-Item -Path $old_log_name -Destination $new_log_name
    if($?){
        Write-EventLog -LogName Application -Source my_application -EventId 4 -Message "Successfully moved $old_log_name to $new_log_name"
    }
    else{
        Write-EventLog -LogName Application -Source my_application -EventId 4 -Message "Failed to move $old_log_name to $new_log_name : $LastExitCode sleeping 5 secconds"
        Start-Sleep -Seconds 5
    }
} Until ($?)

我在这里错过了什么吗???同样在同一主题上,$ LastExitCode显示为空白。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么您要执行的操作如下:

  1. 尝试移动该项目并设置一个新名称,这些名称存储在变量$ old_log_name和$ new_log_name中。
  2. 如果无法重命名该项目,则应将一条失败消息写入EventLog并保持循环状态,直到该项目被移动并重命名为止。
  3. 如果成功移动并重命名了该项目,则应将一条成功消息写入EventLog。

如果是上述情况,则可以通过使用与Do / Until循环关联的-not(!())语句轻松实现此目的。

$old_log_name = 'C:\temp\test.txt'
$new_log_name = 'C:\temp\temp.txt'

Do {
    if (!(Move-Item -Path $old_log_name -Destination $new_log_name -ErrorAction SilentlyContinue)) {
        Write-EventLog -LogName Application -Source my_application -EventId 4 -Message "Failed to move $old_log_name to $new_log_name : sleeping 5 secconds"
        Start-Sleep -Seconds 1
    }
}
        Until ((Test-Path $new_log_name) -eq $true) 
        Write-EventLog -LogName Application -Source my_application -EventId 4 -Message "Successfully moved $old_log_name to $new_log_name"

上面的脚本将尝试移动并重命名该项目,直到直到循环中的语句变为$ true。换句话说,当“测试路径”返回$ true值时,循环将完成。

原因:$ LastExitCode不起作用是因为它仅适用于Win32应用程序,不适用于PowerShell命令。在这种情况下,一种更好的解决方案是在变量为$ true或$ false的情况下向变量添加$ true或$ false语句,然后附加错误代码。