PowerShell Remove-Item静默不会删除单个文件

时间:2015-01-14 20:38:56

标签: powershell

我将一个PowerShell脚本混合在一起,该脚本以递归方式浏览文件夹,搜索分辨率过低的图片。

我已经搜索了几个小时的解决方案,到目前为止我还没有设法删除这些图片。那么与此相关的是什么?

原来文件名中的方括号导致了问题。但是现在Remove-Item抱怨文件被另一个进程使用,我假设这个脚本本身。

$kuveja = 0
$pikkusii = 0
[void][reflection.assembly]::loadwithpartialname("system.drawing")

function Get-Image{
process {
        $file = $_
        [Drawing.Image]::FromFile($_.FullName)  |
        ForEach-Object{
            $_ | Add-Member -PassThru NoteProperty FullName ('{0}' -f $file.FullName)
        }
    }
}

$path = 'H:\Juttui\'
Get-ChildItem $path\* -Include *.jpg, *.jpeg* -Recurse | ? {
    $kuva = $_ | Get-Image
    if($kuva.Width -lt 960 -and $kuva.Height -lt 960){
        Write-Host $_.FullName -fore red
        Remove-Item $_.FullName -Force
        $pikkusii++
    }
    elseif($kuva.Width -lt 540 -or $kuva.Height -lt 540){
        Write-Host $_.FullName -fore yellow
        Remove-Item $_.FullName -Force
        $pikkusii++
    }
    $kuveja++
}

Write-Host "Pics browsed: $kuveja" -fore green
Write-Host "Small: $pikkusii" -fore green

请理解我是PowerShell中的完全菜鸟,我不知道比这里更好的问题。

2 个答案:

答案 0 :(得分:1)

我认为您的$kuva引用会保持文件处于打开状态。尝试删除对象之前,请尝试执行.Dispose()方法。所以像这样:

Get-ChildItem $path\* -Include *.jpg, *.jpeg* -Recurse | ? {
    $kuva = $_ | Get-Image
    if($kuva.Width -lt 960 -and $kuva.Height -lt 960){
        Write-Host $_.FullName -fore red
        $kuva.dispose()
        Remove-Item $_.FullName -Force
        $pikkusii++
    }
    elseif($kuva.Width -lt 540 -or $kuva.Height -lt 540){
        Write-Host $_.FullName -fore yellow
        $kuva.dispose()
        Remove-Item $_.FullName -Force
        $pikkusii++
    }
    $kuveja++
}

答案 1 :(得分:0)

Get-ChildItem $path\* -Include *.jpg, *.jpeg* -Recurse | ? {
    # ...
}

?表示Where-Object,但我认为您真正想要的是ForEach-ObjectForEach-Object的别名是%,但出于这个原因,你不应该在脚本中使用别名(它不太清楚)。

试试这个:

Get-ChildItem $path\* -Include *.jpg, *.jpeg* -Recurse | ForEach-Object {
    # ...
}

如果这不起作用,您在删除之前会有Write-Host次调用,那么您是否看到红色和黄色文本指示应该发生删除?您应该尝试在ISE中运行脚本。在Remove-Item调用之前设置断点,然后单步执行代码。