2017-11-14 3 views
1

현재 Powershell에서 코딩 중입니다. 이제 문서를 찾기 위해 진행률 표시 줄을 표시하는 방법을 찾고 있습니다. 나는 이기 때문에 루프 대신 Get-ChildItem을 사용하고 있습니다. 루프보다 더 빠르고 효율적입니다.Get-ChildItem cmdlet을 사용하는 방법을 이미 알아 냈지만 진행률 표시 줄을 구현하는 방법을 찾는 데 도움이 필요합니다. 여기에 내가 사용하고있는 코드의 예입니다, 그래서 이해하기 쉽습니다 : 때까지powershell에서 파일을 검색하고 진행률 표시 줄을 표시하는 방법

Set-Variable $Loading 0 
Write-Progress -Activity "Collecting Files For Removal..." -CurrentOperation "Collecting User Files..." -PercentComplete $Loading 
Get-ChildItem C:\Users\firea\ -Filter *.D11 -ErrorAction SilentlyContinue -Force 
+0

'Write-Progress '는 실제로'Get-ChildItem'과 같은 명령의 런타임을 측정하도록 설계되지 않았습니다. 예를 들어 파일 콜렉션을 가지고 있고 그것들을 모두 옮기는 경우와 같이,'ForEach' 루프에서'Write-Progress'를 이용하여 각각을 갱신 할 수 있습니다 복사 또는 그 자연의 무언가. – TheIncorrigible1

+0

@ TheIncorrigible1 글쎄, 나는 최근에 루프를 해치려고 노력했다. 왜냐하면 그것들은 적당히 복잡하기 때문에 (나는 어제 Powershell을 사용하기 시작했다), 나는 단순하게 머물러 있기 위해 노력하고있다. 당신은 요점이 있지만 ... 일단 고급 기술에 도달하면 다른 프로젝트로 그 방법을 시도해 볼 수 있습니다. 다른 아이디어가 있습니까? –

+2

검색 진행률 막대를 어떻게 표시합니까? 시스템은 그것이 끝날 때까지 상한을 알지 못합니다.'Get-ChildItem'은 하나의 cmdlet이며 끝나기 전까지 동일한 스레드에서 다른 것을 실행할 수 없습니다. 진행률 막대를 표시하는 것이 무의미합니다. 진행률 표시 줄이 필요하면 시스템에서 먼저 데이터를 가져와야합니다. 즉, 먼저 스캔을 수행해야합니다. 그리고 당신은 피하려고 열심히 노력하고있는 많은 "두려워하는"루프를 사용해야 할 것입니다. –

답변

0

을 그래서,이 같은 소리하는 것은 당신이 X %의 완료를 표시하는 진행 표시 줄을 사용자에게 보여주고 싶은 것입니다 만, Get-ChildItem을 실행하면 얼마나 많은 총 항목이 있는지 알 수 없으므로 실제로 얼마나 가까이에 있는지 말할 수 없습니다. 다른 방법으로 말해 보겠습니다.

나가서 하이킹을한다고 해봅시다. 로컬 트레일을 온라인으로 신속하게 검색하고, 하나를 찾고, 벗어나십시오! 트레일이 시작되는 곳을 알면 샘플링을 기다리고있는 끝 부분에 부스러기 스탠드가 있음을 알 수 있습니다. 하이킹 12 분 후에 여자 친구가 당신에게 전화를해서 그녀에게 다시 엉덩이를 가져다달라고 부탁합니다! 물론, 문제 없습니다. 그녀에게 다가 갈 때에는 추울 수도 있지만, 그렇게 할 수는 있습니다. 그런 다음 그녀는 얼마나 오래 걸릴지 묻습니다. 그리고 당신은 당신이 전혀 모른다는 것을 깨닫습니다. 당신은 12 분이지만, 그 산란장에 도착할 때까지 트레일이 얼마나 오래 있는지 모르기 때문에 3 분이나 35 분이 더 걸릴지 전혀 알 수 없습니다.

오케이, 같은 시나리오이지만, 이번에는 흔적을 넘은 지퍼 라인이 보입니다. 물론, 당신은 흔적의 모든 세부 사항이 무엇인지 모르지만, 당신은 그것이 얼마나 오래인지에 대한 좋은 생각과 흔적의 일반적인 아이디어를 얻습니다. 이번에는 여자 친구가 전화를 걸면 약 20 분, 약 12 ​​분, 약 4 분의 스탠드, 그리고 다시 16 분 후에 그녀가있는 곳으로 돌아갈 수 있다고 말할 수 있습니다.

동일한 아이디어가 스크립트에 적용됩니다. 사용자에게 진행 상황에 대한 대략적인 견적을 제공하려면 사용자가보고있는 내용에 대한 대략적인 아이디어가 있어야합니다. 1 폴더를 찾으십니까? 글쎄, 한 폴더에 대한 대략적인 견적을 얻는 좋은 방법은 없지만, 진행 막대가 필요할 때까지는 오래 걸리지 않아야합니다. 이제 전체 드라이브를 검색하는 경우 Get-ChildItem-directory 매개 변수를 사용하여 얼마나 많은 폴더가 있는지 찾아보고 검색 한 폴더 수에 따라 사용자 진행률을 제공 할 수 있습니다.

예 : 사용자 폴더 \

#Get directory list, silently continue on errors in case script isn't run as an admin and there are system folders 
$folders = Get-ChildItem C:\Users -Recurse -Directory -ErrorAction SilentlyContinue 
#Loop through folders, checking each for files 
$files = For($i = 0; $i -lt $folders.count; $i++) 
{ 
    #Update progress bar for current folder 
    Write-Progress -Activity "Collecting Files For Removal..." -CurrentOperation "Collecting User Files..." -PercentComplete (($i+1)/$folders.count * 100) -Status ("Folder {0} of {1}" -f ($i + 1), $folders.count) 
    Get-ChildItem $folders[$i].FullName -Filter *.D11 -ea 4 
} 

이 예제는 C 아래에있는 모든 폴더를 가져옵니다. 그런 다음 원하는 파일이 있는지 확인하는 폴더를 반복합니다. 각 폴더에 대해 진행률 막대를 업데이트합니다. 이제는 모든 폴더에 같은 수의 파일이있는 것은 아니므로 일부 폴더는 다른 폴더보다 빠르게 완료되지만 사용자에게 진행 상황에 대한 아이디어를 제공합니다.

+0

생각이 나는 것 같아요. 그러나 자폐증은 제 마음의 과정을 다르게 만들고, 그 중 일부는 나에게 조금 혼란 스럽다는 것을 명심하십시오. 내가 사용할 수있는 스크립트 예제를 제공했다면 훨씬 더 잘 이해할 것이다. 그래도 고마워. 나는 사람들이 적어도 나를 여기에서 도우려고한다는 사실에 감사한다. 스크립트를 제공하기로 결정했다면 Powershell에서 루프 스크립트가 약간 이상하기 때문에 가능한 한 간단하게 스크립트를 작성하십시오. (나는 이런 이유로 Powershell보다 Python 스타일을 더 좋아한다) –

관련 문제