Скрипт Powershell для повтора элемента перемещения до тех пор, пока успех не сработает - PullRequest
0 голосов
/ 10 мая 2019

Я записал следующий цикл в спящий режим на 5 секунд, если попытка переименования файла не удалась, однако, когда журнал событий сообщает об ошибке ($? Имеет значение false), он не повторяется, он просто переходит к следующему блоку код:

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 Ответ

1 голос
/ 10 мая 2019

Если я правильно вас понимаю, вы пытаетесь сделать следующее:

  1. Попробуйте переместить элемент и установить новое имя, имена хранятся в переменных $ old_log_name и $ new_log_name.
  2. Если не удается переименовать элемент, он должен написать сообщение об ошибке в EventLog и оставаться в цикле, пока элемент не будет перемещен и переименован.
  3. Если ему удастся переместить и переименовать элемент, он должен написать сообщение об успешном завершении в EventLog.

Если вышеприведенный случай имеет место, вы можете легко добиться этого, используя оператор -not (! ()) В корреляции с циклом Do / Before.

$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. Другими словами, когда «Test-Path» возвращает значение $ true, цикл будет завершен.

Причина, по которой $ LastExitCode не работает, заключается в том, что он работает только с приложениями Win32, а не с командами PowerShell. Лучшим решением для этого в этом случае было бы добавить оператор $ true или $ false к переменной, если оператор является $ true или $ false, а затем добавить код ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...