Powershell测试路径然后删除项目,但另一个进程使用的文件

时间:2016-07-14 13:16:00

标签: powershell

我正在使用Powershell进行一些文件操作并执行以下步骤:

  1. 将文件从一个位置复制到另一个位置(复制项目)
  2. 验证新文件是否符合预期(测试路径)
  3. 如果在新位置验证,请删除原始(删除项目)
  4. 此过程有99.9%的时间有效,但有时我在删除项目步骤时收到错误,通知我原始文件已被使用/锁定。我只能假设使用它的过程是步骤1或2中的copy-item / test-path。

    在继续使用remove-item之前,是否需要指示Powershell等到copy-item / test-path完成?或者是否更有可能在其他地方运行另一个进程,例如访问AV导致此问题?如果是这样,是否有一种方法可以在文件锁定到位时轻松重试?

    以下是执行上述步骤的代码的一部分:

    if ($copySuccess = "TRUE") {
        $wiFiles = Get-ChildItem $xmlDir -Filter $itemNum*.*
        $wiFiles | ForEach-Object {
            if ($copySuccess -eq "TRUE") {
                Copy-Item -LiteralPath $xmlDir\$_ -Destination $processedDir
                    if (!(Test-Path -LiteralPath $processedDir\$_)) {
                        $copySuccess = "FALSE"
                    }
                } 
            }
        }                    
        if ($copySuccess -eq "TRUE") {
            Get-ChildItem $xmlDir -Filter $itemNum*.* | Remove-Item
        }
    

    正在移动的文件是小文本文件或图像文件< 1MB,通常< 10个文件/ itemNum。

    谢谢,Rob。

1 个答案:

答案 0 :(得分:1)

您的cmdlet不太可能导致问题。如果要确保每个cmdlet在下一次启动之前完成,请在

中包装每个命令
$job1 = Start-Job { [Powershell code] }
Wait-Job $job1

对于删除命令,您可以尝试按照

的方式进行操作
While ( Test-Path($yourFileDir) ){
    Try{
        remove-item [your item] -ErrorAction Stop
    }catch{
        Write-Verbose "File locked, trying again in 5"
        Start-Sleep -seconds 5
    }
}

当然,您可以整理这些以满足您的需求,增加适当的时间等。