Geralmente, tentar testar arquivos bloqueados ou não pode levar a todos os tipos de condições de corrida, porque o arquivo pode ficar bloqueado por outro thread / processo logo após a nossa verificação. E a verificação exige bloqueio próprio, a menos que isso não seja feito por meio da API Restart Manager, disponível apenas no Windows Vista (consulte esta resposta ) . Então você foi avisado.
Aqui está a função do PowerShell, que verificará se o arquivo está bloqueado ou não. Adaptado para o PowerShell desta questão: link
Copie e cole-o ou salve junto com o script como Test-IsFileLocked.ps1
e use o recurso de ponto para carregar:
$ScriptDir = Split-Path $script:MyInvocation.MyCommand.Path
. (Join-Path -Path $ScriptDir -ChildPath 'Test-IsFileLocked.ps1')
Em seguida, altere a última linha do seu script para:
Get-ChildItem $path -Recurse -filter "*EDI*" | WHERE {($_.LastWriteTime -le $(Get-Date).AddDays(-$oldTime)) -and !(Test-IsFileLocked -Files $_.FullName)} | Remove-Item -Force
função Test-IsFileLocked
:
function Test-IsFileLocked
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[ValidateNotNullOrEmpty()]
[string[]]$Files
)
Process
{
# Foreach loop to accept arrays either from pipeline or Files parameter
foreach ($file in $Files)
{
$Locked = $false
try
{
# Try to open file
$Test = [System.IO.File]::Open($file, 'Open', 'ReadWrite', 'None')
# Close file and dispose object if succeeded
$Test.Close()
$Test.Dispose()
}
catch
{
# File is locked!
$Locked = $true
}
# Write file status to pipeline
$Locked
}
}
}