Im Allgemeinen kann der Versuch, zu prüfen, ob eine Datei gesperrt ist oder nicht, zu allen möglichen Race-Bedingungen führen, da die Datei unmittelbar nach unserer Prüfung durch einen anderen Thread / Prozess gesperrt werden könnte. Die Überprüfung erfordert eine Sperre selbst, es sei denn, dies erfolgt nicht über die Restart Manager-API, die nur unter Windows Vista verfügbar ist (siehe Antwort ). Sie wurden also gewarnt.
Hier ist die PowerShell-Funktion, die prüft, ob die Datei gesperrt ist oder nicht. An die PowerShell von dieser Frage angepasst: https://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-useuse
Kopieren Sie es oder speichern Sie es zusammen mit Ihrem Skript als Test-IsFileLocked.ps1
und verwenden Sie Dot-Sourcing, um Folgendes zu laden:
$ScriptDir = Split-Path $script:MyInvocation.MyCommand.Path . (Join-Path -Path $ScriptDir -ChildPath 'Test-IsFileLocked.ps1')
Ändern Sie dann die letzte Zeile Ihres Skripts in:
Get-ChildItem $path -Recurse -filter "*EDI*" | WHERE {($_.LastWriteTime -le $(Get-Date).AddDays(-$oldTime)) -and !(Test-IsFileLocked -Files $_.FullName)} | Remove-Item -Force
Test-IsFileLocked
Funktion selbst:
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 } } }