을 그래서,이 같은 소리하는 것은 당신이 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 아래에있는 모든 폴더를 가져옵니다. 그런 다음 원하는 파일이 있는지 확인하는 폴더를 반복합니다. 각 폴더에 대해 진행률 막대를 업데이트합니다. 이제는 모든 폴더에 같은 수의 파일이있는 것은 아니므로 일부 폴더는 다른 폴더보다 빠르게 완료되지만 사용자에게 진행 상황에 대한 아이디어를 제공합니다.
'Write-Progress '는 실제로'Get-ChildItem'과 같은 명령의 런타임을 측정하도록 설계되지 않았습니다. 예를 들어 파일 콜렉션을 가지고 있고 그것들을 모두 옮기는 경우와 같이,'ForEach' 루프에서'Write-Progress'를 이용하여 각각을 갱신 할 수 있습니다 복사 또는 그 자연의 무언가. – TheIncorrigible1
@ TheIncorrigible1 글쎄, 나는 최근에 루프를 해치려고 노력했다. 왜냐하면 그것들은 적당히 복잡하기 때문에 (나는 어제 Powershell을 사용하기 시작했다), 나는 단순하게 머물러 있기 위해 노력하고있다. 당신은 요점이 있지만 ... 일단 고급 기술에 도달하면 다른 프로젝트로 그 방법을 시도해 볼 수 있습니다. 다른 아이디어가 있습니까? –
검색 진행률 막대를 어떻게 표시합니까? 시스템은 그것이 끝날 때까지 상한을 알지 못합니다.'Get-ChildItem'은 하나의 cmdlet이며 끝나기 전까지 동일한 스레드에서 다른 것을 실행할 수 없습니다. 진행률 막대를 표시하는 것이 무의미합니다. 진행률 표시 줄이 필요하면 시스템에서 먼저 데이터를 가져와야합니다. 즉, 먼저 스캔을 수행해야합니다. 그리고 당신은 피하려고 열심히 노력하고있는 많은 "두려워하는"루프를 사용해야 할 것입니다. –