首页 > 解决方案 > ForEach-Object循环中的Powershell“Move-Item:该进程无法访问该文件,因为它正被另一个进程使用”

问题描述

我正在尝试搜索我所有的照片文件夹,并且任何具有特定尺寸的图像(1125x2436 - 即 iphone 上的屏幕截图)都被移动到一个单独的文件夹中,我可以查看并很可能在之后删除。

我已经从编写脚本中获取脚本以复制某些尺寸的图像,如下所示。这会复制图像,但是当我将其更改为Move-Item“Move-Item:该进程无法访问该文件,因为它正被另一个进程使用”时。我猜是因为它仍然由 ForEach-Object 循环中的 System.Drawing.Image 打开。

在删除或传递给变量以在循环外使用之前,我尝试调整它并关闭图像,但没有成功。

这就是我所拥有的

$source = Get-Location
$destination = "C:\Users\USER\Desktop\Output\"
$maxWidth    = 1125
$maxHeight   = 2436

# if the destination path does not exist, create it
if (!(Test-Path -Path $destination -PathType Container)) {
    New-Item -Path $destination -ItemType Directory | Out-Null
}

# Add System.Drawing assembly
Add-Type -AssemblyName System.Drawing

Get-ChildItem -Path $source -File -Recurse | ForEach-Object {
    # capture the full filename so we can use it in the catch block
    $fileName = $_.FullName
    # Open image file
    try {
        $img = [System.Drawing.Image]::FromFile($fileName)
        # use '-ge'  if you want to copy files with a width and/or height Greater Or Equal To the max dimensions
        # use '-and' if you want to copy files where both the Width and the Height exceed the max dimensions
        if ($img.Width -eq $maxWidth -and $img.Height -eq $maxHeight) {
    $_ | Move-Item -Verbose -Destination $destination -Force
        }
    } 
    catch {
        Write-Warning "Could not open file '$fileName' - Not an image file?"
    }
}

我应该说我对 powershell 和发布 stackoverflow 很感兴趣,因此非常感谢任何建议。提前致谢。

标签: powershellfilemovephotosystem.drawing

解决方案


经过一番挖掘,它就像$img.dispose()在移动之前添加一样简单。

回答以防对其他人有用。


推荐阅读