【问题标题】:Get datetaken attribute on file获取文件上的 datetaken 属性
【发布时间】:2014-06-12 20:01:57
【问题描述】:

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

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

GAC 版本位置

--- -------- -------- True v4.0.30319
C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.... Move-Item :该进程无法访问该文件,因为它正在 被另一个进程使用。在 C:\Temp\MovePhoto.ps1:43 char:5 + 移动项目 $FileFullName "$FileDirFull\$FileBaseNameNU" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~ + CategoryInfo : WriteError: (C:\NoBackup\TES...RA\IMG_1372.JPG:FileInfo) [移动项目], IO异常 + FullyQualifiedErrorId : MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

如果我在没有 SystemDrawing 行的情况下执行脚本,它就可以工作。但后来我无法获得 DATATAKEN 属性。我就是想不通我错过了什么。

这是脚本

[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"

}

【问题讨论】:

  • @RachelGallen,这不是重复的,问题接缝来自无法移动的文件。
  • 我已经阅读了那篇文章,它不是重复的@RachelGallen 因为这部分工作就像 ISE(我从那里测试运行脚本)锁定文件。我无法复制文件,因为当我在我的照片文件夹中运行它时,它会移动 40 000 个文件。

标签: powershell duplicates file-attributes


【解决方案1】:

你可以尝试替换

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

Add-Type -AssemblyName "system.drawing"

算了,你的麻烦在于你的文件C:\NoBackup\TES...RA\IMG_1372.JPG 不能移动,因为它是打开的(似乎在$foo var 中可以使用)。首先尝试复制它。您也许可以在Move-Item $FileFullName "$FileDirFull\$FileBaseNameNU" 之前使用$foo.Dispose()

【讨论】:

  • $foo.Dispose() 做了什么?我已经尝试过了,它会产生同样的错误。我不能先复制文件,因为我将在我的照片文件夹上运行它,直到移动大约 40 000 个文件或 430 GB 数据。我没有可用的可用空间。
  • 我无法弄清楚我的脚本中锁定文件的内容
  • System.Drawing.Bitmap 对象打开文件并可以锁定它。 Dispose 应该释放它。你测试了吗?
  • 哈!我现在要分层了!我把 dispose 行放错了。是的,它现在有效!感谢@JPBlanc 的帮助
【解决方案2】:

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

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

可能有一种 .NET 方法可以做到这一点,即:对 PS 更“原生”。

【讨论】:

  • 感谢提供信息,但是根据错误堆栈,问题不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多