我有一个简单的PowerShell脚本,每天运行以压缩和移动一些日志文件。如何在删除原始日志文件之前测试命令是否成功完成。
set-location $logpath1
& $arcprg $pram $dest_file $source_file
Move-Item $dest_file $arcdir
如果Move-Item完成,我想删除item $ source_file
答案 0 :(得分:22)
可以通过特殊变量$?
访问上一个命令的完成状态。
请注意,这适用于非终止错误(就像您从Move-Item获得的那样)。终止错误是直接throw
或在.NET中引发异常的结果,它们会改变代码流。最好使用trap
或try/catch
语句来观察这些类型的错误。
要注意WRT $?
和控制台exes的另一件事是,PowerShell假定退出代码为0表示成功(即$?
设置为$true
),其他任何意味着失败($?
设置为$false
)。不幸的是,并非所有的控制台exe都遵守退出代码惯例,例如可能存在多个成功代码和单个故障代码(0)。对于那些不遵循退出代码规则的exes,请使用评论中指出的$LastExitCode
来确定成功或失败。
答案 1 :(得分:1)
根据您的身份以及您用于存档的组件,您可以检查存档以确认文件外观。我们使用DotNetZip组件压缩归档日志文件(http://dotnetzip.codeplex.com/)。
$zipFileObj = new-object Ionic.Zip.ZipFile($zipName);
[void] $zipFileObj.UpdateFile( "$fileName", "" ) # adds file if doesn't already exist
trap #catch an zip errors and Stop processing
{
write-error "Caught a system exception. Execution stopped"
write-error $("TRAPPED: " + $_.Exception.Message);
exit
}
if ( $zipFileObj.ContainsEntry( $fileName) )
{
remove-item $pathFile # delete file from file-system
}
else
{
# throw error
}