심심한데 윈도우powershell이란걸 공부해보자.


무언가를 배우기전에 가장 먼저 확인할게 있다.

이걸 배우면 무엇을 할 수 있게 되는가이다.


아직 모르겠다. 도스 컨맨드를 대체하는 툴이라고만 알고 있다. 

아마도 리눅스처럼 시스템 전반의 것들을 텍스트 컨맨드로 컨트롤 할 수 있지 않을까 싶다.     


여이~ 땅!


1️⃣ 공식 웹사이트에 들어가보자.

https://learn.microsoft.com/ko-kr/powershell/scripting/learn/ps101/01-getting-started?view=powershell-7.4


2️⃣ 내 컴퓨터에 설치된 버전을 확인해 보자.

Win+R눌러서 실행창 띄우고 powershell을 입력한다.

창이 뜬다. → $psv를 누르고 탭키를 친다. → $PSVersionTable이 입력된다. 엔터를 친다. 


요따구로 나왔다. → 최신 버전인 7.x버전은 여기에서 설치하자. 

 Name                           Value

----                           -----

PSVersion                      5.1.22621.2506

PSEdition                      Desktop

PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}

BuildVersion                   10.0.22621.2506

CLRVersion                     4.0.30319.42000

WSManStackVersion              3.0

PSRemotingProtocolVersion      2.3

SerializationVersion           1.1.0.1


3️⃣powershell은 명령어를cmdlet이라고 부른다. "command-let"으로 발음하란다.

보통 "동사-명사" 형태로 구성되어 있다. 

예를들면 아래와 같습니다.  자꾸 뭘 갖고 오라는 거다.. Get-썸씽..

Get-Command
Get-Help

Get-Member

Get-Service

Get-Process


명령어 목록을 볼 수 있는 Get-Command를 해보자. 너무 길다. 

아래처럼 입력핵서 txt로 저장하자.

Get-Command > cmd.txt  


프린터에 관한 것도 많다. 하나씩 해보면 재밌다.

Function        Get-Printer                                        1.1      

Function        Get-PrinterDriver                                  1.1      

Function        Get-PrinterPort                                    1.1      

Function        Get-PrinterProperty                                1.1      

Function        Get-PrintJob                                       1.1       


4️⃣ 도움말을 잘 써야한다.

파워셀 버전3 이후에는 도움말을 같이 설치하지 않았다고 한다. 다운 받아야한다.

우선 명령창에 아래처럼 입력하자.

Get-Help -Name Get-Help


머라 머라 하면서 아래와 같이 설치하라고 한다.

설명

    Get-Help가 이 컴퓨터에서 이 cmdlet에 대한 도움말 파일을 찾을 수 없습니다

    . 일부 도움말만 표시합니다.

        -- 이 cmdlet을 포함하는 모듈에 대한 도움말 파일을 다운로드하여 설치

    하려면 Update-Help를 사용하십시오.

        -- 이 cmdlet에 대한 도움말 항목을 온라인으로 보려면 "Get-Help Get-He

    lp -Online"을 입력하거나

           https://go.microsoft.com/fwlink/?LinkID=113316(으)로 이동하십시오 

    .

Update-Help를 입력한다. 도움말이 설치된다. 

→ 관리자 모드로 설치해야 모두 설치된단다.   

→ 윈도우키 누르고 powershell입력하면 목록 뜨고, 목록 오른쪽에서 "관리자로 실행"을 선택한다. 

→ Update_Help를 입력한다.


도움말을 검색하는기본 방법은 이런식이다.

Get-Help -Name Get-Process -Full


요딴식으로 할 수 있다. 

Get-Help -Name Get-Command -Full

Get-Help -Name Get-Command -Detailed

Get-Help -Name Get-Command -Examples

Get-Help -Name Get-Command -Online

Get-Help -Name Get-Command -Parameter Noun

Get-Help -Name Get-Command -ShowWindow 


단순하게 porcess가 포함된 명령어를 볼때는 아래처럼해도딘다.

help *process*    


저렇게 하면, 명령어가 아닌 도움말 목록도 나올 수 있어서, 명령어만 검색하려면 아래처럼 하면 된다.     

Get-Command -Name *service* -CommandType Cmdlet, Function, Alias


하루에 하나의 명령어의 도움말을 검색해서 공부하는 것도 재미있을 것이다.    

아래 코드는 명령어 중에 하나를 랜덤으로 도움말을 보여주는 명령어이다.

Get-Command | Get-Random | Get-Help -Full


텍스트 파일로 받고 싶으면, 명령어 뒤에> help2024-01-13.txt로 입력하면된다.

Get-Command | Get-Random | Get-Help -Full > help2024-01-13.txt

     

5️⃣ 윈도우키를 누르고 powershell을 검색해보면,

검색 결과가 나오는 창 오른쪽 하단에 Windows PoserShell ISE 라는 것이 보인다.

그 자식은 그래픽 유저 인터페이스가 추가된 버전이다. 명령어 검색하기도 좀 더 편하다. 참고해보자.    


오늘은 이쯤 해둘까 보다. ㅎㅎ 

〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

두번째 날이 밝았다.


우선, 이론적인건 강아지나 주고,

실생활에서 어떻게 쓸 수 있는지나 알아보자. 

구글링하다가 좋은 사이트를 찾았다.

이놈이다. : https://velog.io/@dailylifecoding/PowerShell-쓸만한-명령어-모음


1️⃣ 웹브라우저 열기.

Start-Process https://www.naver.com/

Start-Process가 정식 Cmdlet이고 별칭으로 start만 써도 된다. 별칭이라는 Alias로 된것을 별칭이라고 표현해봤다. 
start https://www.naver.com/ 


별칭을 알아보려면 아래처럼 하면되다.   

PS C:\Users\jwoh> Get-Alias -Definition Start-Process


CommandType     Name                                               Version

-----------     ----                                               -------

Alias           saps -> Start-Process

Alias           start -> Start-Process 


현재 폴더의 파일 목록을 보는 것은 Get-ChildItem인데 

별칭으로 dir, ls, gci로 해도 파일 리스트를 보여준다.  


별칭의 원래 이름을 알아내는 방법도 있는데.. 알려고 하지 말자.   

(굳이 알고 싶다면 이런 식이다. Get-Alias -Name dir)


2️⃣ 인터넷 접속 테스트

도스창에서는 ping을 많이 때렸는데.. 

powershell에서는 Test-Connetcion을 쓴다.

예) Test-Connection abyul.com


ip주소로 호스트의 이름을 알아보는 재미도 있다.  

PS C:\Users\jwoh> [System.Net.Dns]::GetHostEntry('8.8.8.8')


HostName   Aliases AddressList

--------   ------- -----------

dns.google {}      {8.8.8.8, 8.8.4.4} 


반대로 host명으로 ip를 알아낼 수도 있다. 

잡았다 네이놈..

PS C:\Users\jwoh> [System.Net.Dns]::GetHostAddresses('naver.com') | select IPAddressToString


IPAddressToString

-----------------

223.130.195.95

223.130.195.200

223.130.200.104

223.130.200.107 


IP를 알아내는 2가지 방법을 더 알려주셨다.   

① Test-NetConnection -ComputerName "www.google.com" -InformationLevel "Detailed"

② Resolve-DnsName google.com



3️⃣ 웹의 데이터를 다운 받는 법도 알려주셨다.

(iwr -Uri "https://jsonplaceholder.typicode.com/posts/1").content

(iwr -Uri "https://code.jquery.com/jquery-3.6.1.js").content | Out-File -Encoding utf8 -Path "./jquery-3-6.1.js"


만약 접속에 더 다양한 정보가 필요하다면.. 이렇게 해야한다.

Invoke-WebRequest `

-Headers @{"Authorization" = "Bearer N-..생략..";"accept"="application/json"} `

-Method POST `

    -Body (@{"lastName"="doe";}|ConvertTo-Json) `

    -Uri https://api.dummy.com/getUsers `

    -ContentType application/json 


Invoke-RestMethod -Uri 'https://epsg.io/?format=json&q=5179' | ConvertTo-Json -Depth 10 |  Out-File -Encoding utf8 -FilePath 'C:\Users\jwoh\\1234.txt' 



4️⃣Config Session Cookie

이건 좀 흥미롭네..

$s = New-Object Microsoft.PowerShell.Commands.WebRequestSession

$c = New-Object System.Net.Cookie('Hello','World','/','httpbin.org')

$s.Cookies.Add($c)


$r = iwr 'http://httpbin.org/cookies' -WebSession $s 



5️⃣ 파일 다운로드 

 (New-Object System.Net.WebClient).DownloadFile("https://velog.velcdn.com/images/dailylifecoding/post/5f6599b9-9197-4b71-8836-46c4b699d86d/image.png", "$pwd\downloaded.png")



오늘은 여기가지 해야겠다. 재밌었다. 이야기 끝.

〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

셋째째 날이 밝았다. 


오늘은 powershell 스크립트를 윈도우 스케쥴러에 등록해서 자동화하는 방법을 알아보겠다.

특정 폴더의 파일을 백업할 수도 있고, 웹을 스크롤링해서 파일로 저장하고 이메일로 공유할 수도 있겠다.


1️⃣ 파일 백업 스크립트다.

구글링해서 구해봤다. 출처 : https://blog.naver.com/mplsoft/223033264946


① 파일을 복사해서 백업한다. 백업날짜로 파일이름을 변경한다. 

 # 파일 백업 스크립트 예시

$sourceFile = "D:\data\ExportedEstimate.xlsx"  # 백업할 파일 경로와 이름

$backupFolder = "D:\backup"        # 백업 파일을 저장할 폴더 경로

# 백업 파일 이름 생성

$backupFileName = "{0}_{1:yyyyMMddHHmmss}.xlsx" -f [System.IO.Path]::GetFileNameWithoutExtension($sourceFile), (Get-Date)

# 백업 파일 경로 생성

$backupFilePath = Join-Path -Path $backupFolder -ChildPath $backupFileName

# 파일 복사

Copy-Item -Path $sourceFile -Destination $backupFilePath

# 백업 완료 메시지 출력

Write-Host "File backup complete. Backup file: $backupFilePath"


② 압축파일로 백업한다.

# 백업을 저장할 폴더 경로

$backupFolder = "D:\backup"

# 백업할 디렉토리 경로

$sourceFolder = "D:\data"

# 백업 파일 이름 생성

$backupFileName = "backup_" + (Get-Date -Format "yyyy-MM-dd_HH-mm-ss") + ".zip"

$backupFilePath = Join-Path $backupFolder $backupFileName

# 디렉토리 압축

Compress-Archive -Path $sourceFolder -DestinationPath $backupFilePath

# 백업 파일이 생성되었는지 확인

if (Test-Path $backupFilePath) {

    Write-Output "백업이 성공적으로 완료되었습니다. ($backupFileName)"

} else {

    Write-Output "백업을 실패하였습니다."


③ 챗gpt에 물어보니, 아래처럼 해보란다. 미러링해준다고한다.

 # 원본 폴더 경로 설정

$sourceFolder = "C:\원본폴더경로"


# 대상 폴더(백업 폴더) 경로 설정

$destinationFolder = "D:\백업폴더경로"


# Robocopy를 사용하여 변경된 파일만 복사

Robocopy $sourceFolder $destinationFolder /MIR /COPY:DAT /Z /R:5 /W:5

Robocopy의 옵션들에 대한 설명이다. 

     /MIR : 대상 폴더를 원본 폴더의 미러(정확한 복제)로 만듭니다. 이는 원본 폴더에 없는 파일이 대상 폴더에 있으면 삭제되도록 합니다.

     /COPY:DAT : 파일의 데이터(D), 속성(A), 타임스탬프(T)를 복사합니다.

     /Z : 네트워크 오류 발생 시에도 안전하게 복사할 수 있도록 합니다.

     /R:5 : 읽기 오류가 발생할 경우 5번 재시도합니다.

     /W:5 : 재시도 사이의 대기 시간을 5초로 설정합니다.


2️⃣ 윈도우 예약 작업  → 윈도우 스케쥴러 등록.

다음 링크에서 잘 설명해줬다. 영어다. 크롬에서 한글로 변환해서 봐라. 

https://lazyadmin.nl/powershell/how-to-create-a-powershell-scheduled-task/


작업할 내용을 .ps1으로 저장한 다음, 윈도우 스케줄러에 등록해주면 된다.

스케줄러 창에 수기로 등록해줘도 되고, 아래 코드를 참조해서 powershell 명령어로 처리해도 된다.       


 $taskTrigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Friday -At 3am

$taskAction = New-ScheduledTaskAction -Execute "PowerShell" -Argument "-NoProfile -ExecutionPolicy Bypass -File 'C:\scripts\ADHealth.ps1' -Output 'HTML'" -WorkingDirectory 'c:\scripts'

Register-ScheduledTask 'Lazy PS Tasks' -Action $taskAction -Trigger $taskTrigger


$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Tuesday,Thursday -At 8:30am

$action = New-ScheduledTaskAction -Execute 'PowerShell' -Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\scripts\ADHealth.ps1" -Output "HTML"'

Register-ScheduledTask -TaskName 'Lazy PS Tasks' -TaskPath 'LazyTasks' -Action $taskAction -Trigger $taskTrigger 


 Register-ScheduledTask -TaskName "Lazy PowerShell Tasks" -taskPath 'LazyTasks' -Action $taskAction -Trigger $taskTrigger -User "lazyadmin\Administrator" -Password 'yourPass123' -RunLevel Highest


Get-ScheduledTask -TaskPath \LazyTasks\


 Get-ScheduledTask -TaskName 'Lazy PS Tasks' -TaskPath \LazyTasks\ | Select *




profile