Если я правильно вас понимаю, вы пытаетесь сделать следующее:
- Попробуйте переместить элемент и установить новое имя, имена хранятся в переменных $ old_log_name и $ new_log_name.
- Если не удается переименовать элемент, он должен написать сообщение об ошибке в EventLog и оставаться в цикле, пока элемент не будет перемещен и переименован.
- Если ему удастся переместить и переименовать элемент, он должен написать сообщение об успешном завершении в 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, а затем добавить код ошибки.