2017-03-02 1 views
1

.jpg 파일이있는 폴더가 있습니다. 이러한 제품을 액세스 데이터베이스의 제품과 연결합니다. 제품 소스 중 하나는 .jpg 파일을 제공하지만 현재 사용중인 사진 만 쉽게 다운로드 할 수는 없습니다. 따라서 필자는 PowerShell 스크립트를 사용하여 필요하지 않은 파일을 삭제했습니다. Powershell script to delete files not specified in a listPowershell 진행률 막대가있는 목록에없는 파일을 삭제하는 스크립트

그리고 그것은 잘 작동 x0n @에

$exclusions = Get-Content C:\Users\office\Desktop\ExcludedPhotos.txt 
dir -rec M:\PhotoDirectory\PhotoFolder | Where-Object {$exclusions -notcontains $_.name } | Remove-Item 

신용! 하지만 문제는 영원히 걸리고 나는 검색하고 삭제하는 데 180,000 이상의 항목이 있습니다. 그래서 나는 그 과정을 얼마나 멀리 겪었는지 알 수있는 진도 표시 줄을 만들고 싶었습니다.

그래서 검색의 약간 내가 여기을 시도했다 그러나 문제는 내가 함께 두 가지를 반하게하는 방법을 몰라

"진행 표시 줄을 사용하여"라는 기사를 발견 한 후 :

$exclusions = Get-Content C:\Users\office\Desktop\ExcludedPhotos.txt 
    1..100 | foreach-object { 
    Write-Progress -Activity "Deleting Files" -Status "$_ %" -Id 1 -PercentComplete $_ -CurrentOperation "Deleting File $_" 
     dir -rec M:\PhotoDirectory\PhotoFolder | Where-Object {$exclusions -notcontains $_.name } | Remove-Item 
     } 

그러나 원래 스크립트보다 더 오래 걸리는 것처럼 보입니다. 정확하게 작동하는 방식을 알지 못해서 10-15 개의 파일 만 제거해야 할 때 테스트하고 있습니다.

정말 기본적인 것이 빠져있을 가능성이 있습니다. 실종입니다. 그러나 이것을 이해하는 데 정말로 도움이 될 것입니다. 그러나

PowerShell Console

답변

3

원래 스크립트했다

당신이 열거하려고하고 있기 때문이다

, 필터보다 더 오래 걸릴 것 : 여기

나는 스크린 샷을 추가 한 파일을 100 번 삭제하십시오. 이는 분명히 불필요합니다.

원하는 파일을 삭제하는 과정을 계산 한 다음이를 사용하여 Write-Progress에 전달하는 백분율의 기준으로 사용하십시오.

참고 : 수를 유지하는 가장 쉬운 방법은 정기적 for 루프를 사용하는 아마 이 처음 두 예는 매우 일반적이며, 계정으로 볼륨 (~ 180.000 파일)을 취하는 예를 들어 아래로 이동합니다.

# Grab all the files you need to delete 
$exclusions = Get-Content C:\Users\office\Desktop\ExcludedPhotos.txt 
$filesToDelete = Get-ChildItem M:\PhotoDirectory\PhotoFolder -Recurse | Where-Object {$exclusions -notcontains $_.Name } 

for($i = 0; $i -lt $filesToDelete.Count; $i++){ 
    # calculate progress percentage 
    $percentage = ($i + 1)/$filesToDelete.Count * 100 
    Write-Progress -Activity "Deleting Files" -Status "Deleting File #$($i+1)/$($filesToDelete.Count)" -PercentComplete $percentage 
    # delete file 
    $filesToDelete[$i] |Remove-Item 
} 
# All done 
Write-Progress -Activity "Deleting Files" -Completed 

당신이 비율을 표시하는 데 사용할 수있는 또 다른 특징은 상대적 볼륨 (총 바이트 수) 제거됩니다. 우리는 단순히 우리가 총을 제거 할 필요가 얼마나 많은 바이트를 추적하여이 작업을 수행 할 수 있습니다, 우리는 지금까지 얼마나 많은을 제거했습니다

$exclusions = Get-Content C:\Users\office\Desktop\ExcludedPhotos.txt 
$filesToDelete = Get-ChildItem M:\PhotoDirectory\PhotoFolder -Recurse | Where-Object {$exclusions -notcontains $_.Name } 
$TotalSize = ($filesToDelete |Measure-Object -Property Length -Sum).Sum 
$BytesRemoved = 0 

foreach($file in $filesToDelete){ 
    $percentage = $BytesRemoved/$TotalSize * 100 
    Write-Progress -Activity "Deleting Files" -Status "Deleted $BytesRemoved/$TotalSize bytes" -PercentComplete $percentage 
    $file |Remove-Item 
    $BytesRemoved += $file.Length 
} 
Write-Progress -Activity "Deleting Files" -Completed 

@MatthewWetmore가 Write-Progress 삭제할 때마다 호출, 지적 하듯이 물론 파일은 약간의 오버 헤드가 발생할 것입니다. 그리고 180.000 개의 파일을 사용하면 이 아니며 진행률이 3.56325 %에서 3으로 바뀌면이 UI 업데이트에 관심이있을 것입니다.5만6천3백31퍼센트

당신이 할 수있는 항목 수가 전체 세트의 1 % 단위로 계산하고 각 반복에있는 파일의 전체 범위를 제거 for 루프를 사용하는 것입니다 :

[int]$hundredthStep = $filesToDelete.Count/100 
for($i = 0; $i -lt $filesToDelete.Count; $i += $hundredthStep){ 
    # calculate progress percentage 
    $percentage = ($i + 1)/$filesToDelete.Count * 100 
    Write-Progress -Activity "Deleting Files" -Status "Deleting File up to #$($i+1)/$($filesToDelete.Count)" -PercentComplete $percentage 
    # delete file 
    $filesToDelete[$i..($i + $hundredthStep - 1)] |Remove-Item 
} 
# All done 
Write-Progress -Activity "Deleting Files" -Completed 
+0

수를 삭제할 수있는 파일이 매우 높은 경우, 그는 또한 모든 사람들과 진전을 맺지 않을 때 도움이 될 것입니다. 파일 대신에 여러 개의 파일이 있습니다. 예를 들어, 계수를 100으로 나눈 값을 가장 가까운 int로 반올림 한 다음 카운터에 대해 계수로 사용합니다. 예 : 1 ~ 100 개의 파일을 사용하면 모든 파일에 진행 상황을 기록합니다. 다른 모든 파일은 200 개입니다. 1000, 매 10 년마다 ... –

+0

또한 매우 큰 나무의 재귀 get 항목은 매우 느립니다. get-item -recurse -directory, getter-item -file을 반복적으로 사용하면 좋을 것입니다. OS VHD 또는 WIM 내용의 유효성을 검사하기 위해이 설명서를 변형했습니다. –

+0

"열거, 필터 및 파일을 100 번 삭제하려고 시도했기 때문입니다. 이는 분명 불필요합니다." 물론 그것이 전체 스크립트를 100 번 반복하여 실행하려고 할 때 더 오래 걸릴 것이고 스스로 반복 할 때 진행률 표시 줄을 알려주는 것이 당연합니다. 나는 그것이 제거 된 총 바이트를 계산하는 옵션을 좋아한다. 나는 그것을 시도하고 나의 발견으로 돌아올 것입니다. – Liberator17

1

당신이 원하는 같은 것을 할 (이 안된 그래서 당신은 제대로 작동하고 행복하면 내가 당신을 제거해야합니다 제거 cmdlet의 -whatif 넣었습니다 조심 일) :

$exclusions = Get-Content C:\Users\office\Desktop\ExcludedPhotos.txt 
$files = dir -rec M:\PhotoDirectory\PhotoFolder | Where-Object {$exclusions -notcontains $_.name } 

$files | foreach-object { 
    $num += 1  
    Write-Progress -Activity "Deleting Files" -Status "$_ %" -Id 1 -PercentComplete (($num/$files.count) * 100) -CurrentOperation "Deleting File $($_.name)" 
    $_ | Remove-Item -WhatIf 
} 
관련 문제