PowerShell에서는 간단한 프로그래밍을 할 수 있다.
 간단한 프로그래밍을 이용하면, 간단한 장치나 동작을 시킬 수 있다.

 여기서 간단한 프로그래밍은 중복되는 파일이 있는지 확인하면서 삭제하거나 특정 위치로 옮기거나 실행시켜서 제거하는 장치를 만들 수 있다.

 

 그걸 하기 위해서 변하는 값을 저장하여 처리할 수 있어야 하며, PowerShell에서도 변수를 사용할 수 있다.

 

[PowerShell] 간단한 변수 생성.

 PowerShell에서 변수를 생성하기 위해선 '$'라는 기호를 사용해야 한다.

 

1
2
3
4
5
6
7
8
9
# 변수값을 정의 하기 위해서는 '$'를 사용해야한다.
$values = 0;
 
# 변수값을 숫자로 적용할 수 있다.
$123 = 0;
 
# 변수를 제거하는 명령어.
Remove-Variable values, 123;
 
cs

 

 

 변수를 사용하고, 제거하기 위해서는 PowerShell에서는 Remove-Variable이라는 함수를 사용해서 제거를 할 수 있다.

 변수 값을 제거해주지 않으면, PowerShell에 있는 변수를 재활용하지 않는 이상은 계속 쌓여서 메모리에 차지하는 문제점이 있다.

 

[PowerShell] PipeLine에 연결된 변수 사용법.

 참고 사이트: [MSDOC] PowerShell Pipelines
 PowerShell은 명령어 혹은 프로그램에서 출력되는 값을 받아들여서 다른걸로 재활용 할 수 있다.

 이것을 PipeLine이라고 하며, 다른 프로세서간의 통신을 연결해서 처리 할 수 있다.

1
2
3
4
5
6
# command1에 나온 결과물을 command2에 보내고, command2에 나온 결과물을 command3에 보낸다.
command1 | command2 | command3;
 
# list-item에서 나온 값을 출력하는 방법.(굳이 할 필요는 없다.)
ls | echo
 
cs

 여기서 PipeLine의 변수를 이용해서 제어를 할 수 있는데.

 이 제어하기 위해서 '$_'라는 변수형태를 취하게 된다.

1
2
3
4
5
6
7
8
9
# Text File 검색.
Get-ChildItem -Path *.txt |
# 개체 필터링.
  Where-Object {$_.length -gt 10000|
# 길이[파일 크기]에 맞춰서 정렬[오름차순]
    Sort-Object -Property length |
# 테이블 형태에 맞춰서 출력.
      Format-Table -Property name, length
 
cs

 

[PowerShell] 조건문

 PowerShell에서는 간단한 계산을 할 수 있지만, 알고리즘을 사용하기 위해서는 연산만 할 수 있으면 안된다.

 특정 조건에 맞춰서 참과 거짓으로 나뉘어져야하는데. 이 방법은 if문과 switch문을 이용해서 적용 할 수 있다.

 참고 사이트: [MSDOC] PowerShell 조건문 

[PowerShell] 간단한 if문 사용하기.

  if문은 참과 거짓을 사용할 수 있어야하므로, 2가지 경우를 사용할때 사용 할 수 있다.

 if문과 if-else문, if-else if문을 사용할 수 있다.

1
2
3
4
5
6
7
if(1 -eq 2){
 echo "True";
}elseif(1 -eq 2){
 echo "2=2";
}else{
 echo "False";
}
cs

 

[PowerShell] 간단한 Switch문 사용하기.

 PowerShell에서 if문을 사용하기에 분기가 많거나 하면, 거기에 맞춰서 처리하기 위해서 Switch문을 사용한다.

 

1
2
3
4
5
6
7
8
$switchValues = 0;
 
switch($switchValues){
    0 { $a = 1; }
    1 { $a = 2; }
#...
    default { $a = 0; }
}
cs

 

 

[PowerShell] 반복문.

 조건문 외에도 조건에 맞춰서

[PowerShell] 간단한 반복문 For문

1
2
3
4
5
#For문 적용.
for($i = 0$i -lt 100$i++){
    echo $i;
}
 
cs

 

 

[PowerShell] 간단한 반복문 ForEach문

1
2
3
4
5
6
#Foreach문 적용.
$folders = (Get-ChildItem -File *.txt);
foreach($folder in $folders)
{
    echo $folder.Name;
}
cs

 

[PowerShell] 간단한 반복문 While문

1
2
3
4
5
6
#while문 적용.
while($i -le 100){
    echo $i;
    $i+=1;
}
 
cs

 

[PowerShell] 조건에 적용할 비교문 방식.

-eq = equal

-ne = not equal

-le = least equal

-lt = least

-ge = great equal

-gt = great

 

-and = and

-or = or

-not = not

 

이렇게 맞춰서 비교문을에 적용 할 수 있으며, 비교문, 반복문의 조건을 적용할때 사용하면된다.

 

[PowerShell] 간단한 함수 생성.

참조 사이트: [MSDOC] 함수

반복적으로 동작하는 동작 방식을

1
2
3
4
5
6
7
8
9
10
11
# 함수 생성.
function addLines{
# 매개변수 저장.
    param (
        $paramHTMLFileName
    )
#함수 처리과정.
    "<p>`&nbsp`; <br/></p>" >> $paramHTMLFileName;
}
 
 
cs

 

[PowerShell] 간단한 예외 처리.

참조 사이트: [MSDOC]예외처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 함수 생성.
function addHashDataLines{
    # 매개변수.
    param(
        $paramHTMLFileName,
        $paramAlgorithm,
        $paramTargetFileName
    )
    
    # 예외 처리.
    try{
        $hashData = Get-FileHash -algorithm $paramAlgorithm $paramTargetFileName;
        $algorithm = $hashData.Algorithm;
        $hash = $hashData.Hash;
        "<p>`&nbsp`; $algorithm : <br/></p>" >> $paramHTMLFileName;
        "<p>`&nbsp`; $hash <br/></p>" >> $paramHTMLFileName;
    }catch{
        echo "Error! Can't $paramTargetFileName is $paramAlgorithm Make File Hash!";
    }
}
 
cs

 

 

 

Posted by JunkMam
,

해당 방법은 다음 링크에 있는 내용을 보고 테스트한 후 확인한 것이다.

https://stackoverflow.com/questions/502002/how-do-i-move-a-file-to-the-recycle-bin-using-powershell

 

1
2
3
4
Add-Type -AssemblyName Microsoft.VisualBasic
[Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile('d:\foo.txt','OnlyErrorDialogs',
'SendToRecycleBin')
 
cs

 

 이렇게 하면,제대로 동작되는걸 확인했다.

 

'PowerShell' 카테고리의 다른 글

[PowerShell] PowerShell 간단한 사용법.  (0) 2023.01.01
Powershell에서 Progress 사용하기.  (0) 2020.07.03
Posted by JunkMam
,

 

 

 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
,