0

写真から DATETAKEN 属性を取得し、それに基づいてフォルダー構造を作成し、ファイルをこの新しい場所に移動するスクリプトを作成しようとしています。使用しようとしているスクリプトを Google で見つけましたが、実行すると次のように返されます。

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-項目 : 別のプロセスで使用されているため、プロセスはファイルにアクセスできません。C:\Temp\MovePhoto.ps1:43 文字: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"

}

4

2 に答える 2

0

交換してみてはいかがですか

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

Add-Type -AssemblyName "system.drawing"

それを忘れてください、あなたの問題は、ファイルが開いているために移動できないことです( varC:\NoBackup\TES...RA\IMG_1372.JPGで使用するために開いているようです)。$fooまずはコピペしてみてください。おそらく$foo.Dispose()前に使用できますMove-Item $FileFullName "$FileDirFull\$FileBaseNameNU"

于 2014-06-12T20:24:35.447 に答える
0

GetDetailsOf() を使用して、VBScript でこれを行いました... MSDNを参照してください

これは、PowerShell を使用して実行できます。参照してください... Scripting Guys

これを行う .NET メソッドの方法があるかもしれません。つまり、PS に対してより「ネイティブ」です。

于 2014-06-12T20:47:38.077 に答える