获取日期属性文件

时间:2014-06-12 20:01:58

标签: powershell duplicate-removal file-attributes

我正在尝试编写一个脚本,该脚本将从照片中获取DATETAKEN属性并基于此创建文件夹结构并将文件移动到此新位置。我在谷歌上发现了我试图使用的脚本,但是当我运行它时它返回:

  
    

PS C:\ Temp> C:\ TEMP \ MovePhoto.ps1

  
     

GAC版本位置

     

--- ------- -------- True v4.0.30319
  C:\ WINDOWS \ Microsoft.Net \装配\ GAC_MSIL \ System.Drawing中\ v4.0_4.0.0 ....   Move-Item:进程无法访问该文件,因为它正在存在   由另一个进程使用。在C:\ Temp \ MovePhoto.ps1:43 char:5   + Move-Item $ FileFullName“$ FileDirFull \ $ FileBaseNameNU”   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~       + CategoryInfo:WriteError:(C:\ NoBackup \ TES ... RA \ IMG_1372.JPG:FileInfo)[Move-Item],   IOException异常       + FullyQualifiedErrorId:MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

如果我在没有SystemDrawing行的情况下执行该脚本,则可以正常工作。但后来我无法获得DATETAKEN属性。我只是想弄清楚我错过了什么。希望你能帮助我。

这是脚本

[reflection.assembly]::LoadWithPartialName("System.Drawing")

$FileAll = (Get-ChildItem $SourcePath -Recurse | where {!$_.psiscontainer} | Select-Object Name,Fullname,BaseName,Extension,CreationTime,LastWriteTime,Length,@{Name="MD5";Expression={Get-Md5Hash $_.fullname}} | group MD5 | Where {$_.Count -gt 1 } | %{$_.Group} | sort MD5)
foreach ($File in $FileAll) {
    $FileBaseName = $File.BaseName
    $FileExtension = $File.Extension
    $FileFullName = $File.FullName
    $FileBaseNameNu = $FileBaseName + $FileExtension
    $FileName = $File.Name
}

$foo = New-Object -TypeName System.Drawing.Bitmap -ArgumentList $FileFullName
$date = $foo.GetPropertyItem(36867).Value[0..9]
$arYear = [Char]$date[0],[Char]$date[1],[Char]$date[2],[Char]$date[3]
$arMonth = [Char]$date[5],[Char]$date[6]
$arDay = [Char]$date[8],[Char]$date[9]
$strYear = [String]::Join("",$arYear)
$strMonth = [String]::Join("",$arMonth) 
$strDay = [String]::Join("",$arDay)
$DateTaken = $strYear + "-" + $strMonth + "-" + $strDay

$FileLastWriteTime = $File.LastWriteTime
$FileDirYear = $FileLastWriteTime.Year
$FileDirDate = $FileLastWriteTime.ToShortDateString()
$FileDirFull = "$DestinationPath\DUBLETTER\$FileDirYear\$DateTaken" 

# Create destination path
if ((Test-Path $FileDirFull) -eq $false) { 
    New-Item -Path $FileDirFull -ItemType Directory
}                                        

if (Test-Path (Join-Path $FileDirFull $File.Name)) {
    $n = 0
    while ((Test-Path (Join-Path $FileDirFull $FileBaseNameNU)) -eq $true){
        $FileBaseNameNU = $FileBaseName + "-" + ++$n + $FileExtension
    }
}
Move-Item $FileFullName  "$FileDirFull\$FileBaseNameNU"

}

2 个答案:

答案 0 :(得分:0)

您可以尝试替换

吗?
[reflection.assembly]::LoadWithPartialName("System.Drawing")

通过

Add-Type -AssemblyName "system.drawing"

忘了它,你的问题就在于你的文件C:\NoBackup\TES...RA\IMG_1372.JPG因为它打开而无法移动(似乎在$foo var中可以使用)。首先尝试复制它。您可以在$foo.Dispose()

之前使用Move-Item $FileFullName "$FileDirFull\$FileBaseNameNU"

答案 1 :(得分:0)

我已经在VBScript中完成了这项工作,使用GetDetailsOf()...参见MSDN

这可以使用PowerShell完成,请参阅... Scripting Guys

可能有.NET方法这样做,即:更多" native"到PS。