Schließen Sie ein Datei-handle geöffnet werden .NET

Arbeite ich an einem Skript zum umbenennen von Dateien basierend auf EXIF-Daten.

param([string]$path)

# http://blogs.technet.com/b/jamesone/archive/2007/07/13/exploring-photographic-exif-data-using-powershell-of-course.aspx
[reflection.assembly]::loadfile( "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll") | out-null

function MakeString { 
    $s=""
    for ($i=0 ; $i -le $args[0].value.length; $i ++) {
        $s = $s + [char]$args[0].value[$i]
    }
    return $s
}

$files = Get-ChildItem -Path $path
foreach ($file in $files) {
    if ($file.Extension -ne ".jpg") { continue }
    if ($file.Name -match "^(\d+)-(\d+)-(\d+)") { continue }
    $exif = New-Object -TypeName system.drawing.bitmap -ArgumentList $file.FullName
    $captureDate = MakeString $exif.GetPropertyItem(36867)
    $captureDate = ($captureDate -replace ":", '-').Substring(0,19)
    $newFilename = $captureDate + " " + $file.Name.Trim()
    $file.Name + " -> " + $newFilename
    $file |Rename-Item -NewName $newFilename
}

Lesen das Datum aus den EXIF-ist kein problem, aber wenn ich versuche die Datei umzubenennen, erhalte ich diese Fehlermeldung:

Rename-Item : The process cannot access the file because it is being used by another process.
At D:\Norwegen\RenamePhotos.ps1:25 char:12
+     $file |Rename-Item -NewName $newFilename
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (D:\Norwegen\P1270465 (1920x1433).jpg:String) [Rename-Item], IOException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

Wenn ich den monitor das Verzeichnis, in ProcMon kann ich sehen, dass die Dateien geschlossen sind, eher spät:

Schließen Sie ein Datei-handle geöffnet werden .NET

(achten Sie auf die markierte Zeile, es ist aus einer früheren Datei in der Mitte der Einträge aus der Datei wird gerade verarbeitet)

So, wie kann ich die Datei schließen (die ist wohl noch offen aus den EXIF gelesen) so kann ich es umbenennen?

Was ich bereits versucht, schließen Sie die Datei öffnen:

Remove-Variable exif
$file.Close()
$exif.Dispose()? Ich bin mir zwar nicht sicher, ob Sie benötigen, rufen Sie Save() ersten.

InformationsquelleAutor Gerald Schneider | 2015-02-08

Schreibe einen Kommentar