我正在使用Powershell进行一些文件操作并执行以下步骤:
此过程有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。
答案 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
}
}
当然,您可以整理这些以满足您的需求,增加适当的时间等。