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:
(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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie nur Lesen aus der Datei, dann wird ein Aufruf von
Dispose()
sollte den trick tun. Ex.InformationsquelleAutor Frode F.