如何在powershell中确认完成以前的命令

时间:2010-09-15 20:03:57

标签: powershell

我有一个简单的PowerShell脚本,每天运行以压缩和移动一些日志文件。如何在删除原始日志文件之前测试命令是否成功完成。

set-location $logpath1
& $arcprg $pram $dest_file $source_file
Move-Item $dest_file $arcdir

如果Move-Item完成,我想删除item $ source_file

2 个答案:

答案 0 :(得分:22)

可以通过特殊变量$?访问上一个命令的完成状态。

请注意,这适用于非终止错误(就像您从Move-Item获得的那样)。终止错误是直接throw或在.NET中引发异常的结果,它们会改变代码流。最好使用traptry/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
}