PowerShell을 이용하면서 자주 문제 있던 부분이 반복문에서 어떻게 동작하고 있는지 알수 없어서 답답함이 없지 않아 있었다.

 

 특히 파일을 지우거나 하는 경우에 rm *을 하면, 어떤 파일이 어떻게 어느 시점에 지워지고, 얼마나 시간이 걸리는지 궁금한데.

 

 이걸 알 수 있는 방안이 전혀 없으니. 답답할 노릇이였다.

 

 그렇다고 탐색기를 이용해서 처리하기엔 GUI가 있으니. 부담도 있다고 할까.

 

 그래서 프로그래스(현재 동작하고 있는 상황을 표시하는 게이지 바)를 추가하고자 했다.

 

 참고 사이트에서는 MS에서 제공하는 PowerShell 도움말이다.

 

 나는 PowerShell-7을 기준으로 작성되어 있음을 참고하길 바란다.

 

 

foreach ( $i in 1..10 ) {
  Write-Progress -Id 0 "Step $i" -PercentComplete (($i / 10) * 100);
  foreach ( $j in 1..10 ) {
    Write-Progress -Id 1 -ParentId 0 "Step $i - Substep $j"  -PercentComplete (($j / 10) * 100);
    foreach ( $k in 1..10 ) {
      Write-Progress -Id 2  -ParentId 1 "Step $i - Substep $j - iteration $k" -PercentComplete (($k / 10) * 100) -SecondsRemaining 10;
      start-sleep -Millisecond 150
    }
  }
}

 

 여기서 사용되는 $i, $j, $k는 반복문에 사용되는 변수이고, 프로그래스를 출력하는 명령어는

 Write-Progress가 된다.

 

 위 소스를 사용하면,

 

 

 

 그림과 같이 된다.

 

 이걸 이용해서 프로그래스 바가 나오는데.

 

 여기서 -파란색 바가 증가하는 방법은

 -PercentComplete <Value>를 이용하면 되는것이고,

 

 시간을 표시하는 것은

 -SecondsRemaining <Value>를 사용하면 된다.

 

 

 이걸 이용해서 rm을 하는 것을 프로그래스로 표현할 수 있게 되는데.

 

 

$dirs = @();
$dirs += (Get-ChildItem -Directory);

$dirNumber = 0;
$dirPercent = 0;
$dirName = 0;
for($dirNumber = 0; $dirs.Length -gt $dirNumber; $dirNumber++)
{
    cd $dirs[$dirNumber].FullName;
    $dirName = $dirs[$dirNumber].Name;
   
    $dirLength = $dirs.Length;
    $dirPercent = ($dirNumber/$dirs.Length)*100;
   
    Write-Progress -Id 0 "DirName: $dirName : $($dirNumber+1)/$dirLength - $dirPercent%" -PercentComplete ($dirPercent);
   
    $files = (Get-ChildItem -File);
    $fileNumber = 0;
    $filePercent = 0;
    $fileLength = 0;
    $fileName = 0;
    if($files.Length -gt 0)
    {
      for($fileNumber = 0; $files.Length -gt $fileNumber; $fileNumber++)
      {
          $fileName = $files[$fileNumber].Name;
         
          $fileLength = $files.Length;
          $filePercent = ($fileNumber/$files.Length)*100;
          Write-Progress -Id 1 -ParentId 0 "ReMove FileName: $fileName : $($fileNumber+1)/$fileLength - $filePercent %"  -PercentComplete ($filePercent);
          rm -Force $files[$fileNumber];
      }
   
      Remove-Variable files, fileNumber, filePercent, fileLength, subDirs, fileName;
    }
   
    $subDirs = (Get-ChildItem -Directory);

    if($subDirs.Length -ne 0)
    {
      $dirs+=$subDirs;
    }
    else
    {
      cd ..;
      rm -Force $dirs[$dirNumber];
    }
}

Remove-Variable dirs, dirNumber, dirPercent, dirLength, dirName;




 이렇게 완성된다.

 

 

  DFS 알고리즘이 아니라. BFS을 이용한 방식이라서 Id 0의 프로그래스가 점점 증가하는 형태가 되지만, 잘 표시가 된다.

Posted by JunkMam
,