检查 Compress-Archive 是不是可以根据文件存档的成功产生真/假

Posted

技术标签:

【中文标题】检查 Compress-Archive 是不是可以根据文件存档的成功产生真/假【英文标题】:checking if Compress-Archive can produce a true/false based on success of the archival of a file检查 Compress-Archive 是否可以根据文件存档的成功产生真/假 【发布时间】:2021-09-09 16:44:10 【问题描述】:

我有以下代码:

$items = Get-ChildItem -Path 'D:\Myoutput\'
$items | ForEach-Object 

  $lastWrite = ($_).LastWriteTime
  $timespan = New-Timespan -days 3 -hours 0 -Minutes 0
  if(((get-date) - $lastWrite) -gt $timespan) 
    $name = $_.Name
    $isDir = $_.PSIsContainer
    if(!$isDir) 
      $_ | Compress-Archive -DestinationPath "D:\Myoutput\Archive\$name.zip"
      if (**above_line** is success) 
       echo "$name is zipped"
       $_ | Remove-Item
      
    
  

请帮忙,我怎样才能知道'$_ | Compress-Archive -DestinationPath "D:\Myoutput\Archive$name.zip"' 是否成功。

【问题讨论】:

【参考方案1】:

Compress-Archive 会在出现问题时抛出异常,并且会删除部分创建的档案 (source)。所以,你可以做两件事来确保它是成功的:

    捕获异常 测试存档是否存在

例子:

$items = Get-ChildItem -Path 'D:\Myoutput\'
$items | ForEach-Object 

  $lastWrite = ($_).LastWriteTime
  $timespan = New-Timespan -days 3 -hours 0 -Minutes 0
  if(((get-date) - $lastWrite) -gt $timespan) 
    $name = $_.Name
    $isDir = $_.PSIsContainer
    if(!$isDir) 
      try 
        $_ | Compress-Archive -DestinationPath "D:\Myoutput\Archive\$name.zip"
        if (Test-Path -Path "D:\Myoutput\Archive\$name.zip") 
          Write-Host "$name is zipped"
          $_ | Remove-Item
         else 
          Write-Host "$name is NOT zipped" -ForegroundColor Red
        
       catch 
        Write-Host "$name is NOT zipped" -ForegroundColor Red
      
    
  

【讨论】:

【参考方案2】:

Compress-Archive 如果失败已经抛出错误,您可以在删除原始文件之前捕获它。例如,我使用continue 跳过其余的命令。您也可以使用Get-ChildItem -File 跳过检查文件夹:

Foreach ($file in (Get-Item C:\temp\ -File)) 
  Try  $file | Compress-Archive -DestinationPath C:\BadPath\test.zip 
  Catch  Write-Warning ("Skipping file due to error: " + $file.FullName); continue 
  Remove-Item $file

当我使用上面的 Bad path 时,输出如下所示:

WARNING: Skipping file due to error: C:\temp\test1.txt
WARNING: Skipping file due to error: C:\temp\test2.txt

这些文件不会被删除。

【讨论】:

以上是关于检查 Compress-Archive 是不是可以根据文件存档的成功产生真/假的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Compress-Archive 压缩/归档隐藏文件?

Powershell Compress-Archive 对老化文件

Powershell Compress-Archive 文件到文件夹中

Windows 7中未知的Compress-Archive powershell命令

如何使用 Powershell Compress-Archive 仅压缩文件夹中的 pdf?

压缩存档,排除包含文件夹