我有一个文件夹,其中包含多个包含图像的文件夹。我想根据尺寸过滤图像

时间:2019-05-31 05:07:28

标签: powershell

此代码可以正确显示ImageName和FolderName,但是Dimension仍为空白。正确显示的数据不会保存在csv文件中。

此外,如果基于尺寸的条件不起作用。

#-----------powershell script------------
foreach ($folder in $Folders) { 
    $Images = Get-ChildItem  -Path $Folder -Filter *.png
    $Results = @()
    foreach ($image  in $Images) { 
        $dimensions = $image.Dimensions
        # $dimensions = "$($image.Width) x $($image.Height)"
        If ($dimensions -ne '1000 x 1000') {


            $Results += [pscustomobject]@{
                ImageName  = $image
                FolderName = $Folder
                Dimension  = $dimensions
            }
        }
    }



    $Results | FT -auto

    # $ExcelData= Format-Table -property @{n="$image";e='$Folder'}
    $Results | Export-csv "C:\Users\M1036098\Documents\Imagelessthan1000pi.txt" -NoTypeInformation

}

输出中的尺寸属性保持空白

2 个答案:

答案 0 :(得分:2)

所以让我们回顾一下为什么这不起作用。 Get-ChildItem带回对象System.Io.FileInfo

System.IO.FileIonfo我们可以从Microsoft看到没有名为Dimensions的方法或属性。

然后让我们获取这些尺寸...

首先,我们将图像加载到内存中并获取大小。

$Folders = @("C:\Test")

$Folders | %{
    $Folder = $_
    Get-ChildItem  -Path $_ -Filter *.png | %{
        try{
            $Image = New-Object System.Drawing.Bitmap "$($_.FullName)"
            [pscustomobject]@{
                ImageName  = $_.Name
                FolderName = $Folder
                Dimension  = "$($Image.Height) x $($Image.Width)"
            }
        }catch{
        }
    } | ?{
        $_.Dimension -ne "1000 x 1000"
    }
}

输出类似于

ImageName     FolderName     Dimension  
---------     ----------     ---------  
Test1.png     C:\Test        1440 x 2560
Test2.png     C:\Test        1200 x 1200

编辑:为Sonam添加功能。基于已发布的答案。

function Get-ImageDimension([string]$Path, [array]$ImageExtensions, [array]$ExcludeDimensions){

    Get-ChildItem -Path $Path -Include $ImageExtensions -Recurse | foreach-object{
        try{
            $image = [Drawing.Image]::FromFile($_);
            [pscustomobject]@{
                ImageName = $_.Name
                FolderName = $_.DirectoryName
                Dimension= "$($image.Width) x $($image.Height)"
            }
        }catch{
        }
    } | ?{
        $ExcludeDimensions -notcontains $_.Dimension
    }
}


Get-ImageDimension C:\Test\ -ImageExtensions *.png -ExcludeDimensions "1000 x 1000" | export-csv C:\Test\Test.csv

答案 1 :(得分:0)

感谢您的解决方案。我使用System.Drawing重写了代码。     代码段:

try{
    $FolderBase= "E:\D\Demo\Demo\"
    $Folders= get-ChildItem "$FolderBase*" |

    foreach ($folder in $Folders){ 

        $Images=Get-ChildItem  -Path $Folder -Filter *.png
        $Results = @()

        #$image=(Get-ChildItem  -Path $Folder *.png)
        $Images | ForEach-Object { 
            $img = [Drawing.Image].FromFile($_); 
            $dimensions = "$($img.Width) x $($img.Height)"

            If ($dimensions -ne "1000 x 1000") {
                $Results +=  [pscustomobject]@{
                    ImageName = $img
                    FolderName = $Folder
                    Dimension= $dimensions
                }
            }
        }
    }
    $Results | FT -auto
    # $ExcelData= Format-Table -property @{n="$image";e='$Folder'}
    $Results|Export-csv "C:\Users\****\Documents\Imagelessthan1000pi.txt" -NoTypeInformation
}catch{
}

现在,我得到了预期的结果,但是

  1. 我无法将数据写入文件。(excel(首选),csv,文本)。我尝试了File和Export-csv。

  2. 其中一个文件夹不包含任何大尺寸(最大700 kb)图像。在该特定文件夹上执行循环时, 引发内存异常,它不会遍历所有 图片。