我编写了以下循环,如果尝试重命名文件失败,则将休眠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显示为空白。有什么想法吗?
答案 0 :(得分:1)
如果我对您的理解正确,那么您要执行的操作如下:
如果是上述情况,则可以通过使用与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语句,然后附加错误代码。