정확히 어떤 때라고 말씀드리기는 어렵지만 코딩을 하다 보니 가끔씩 알파벳 인덱스가 필요한 경우가 종종 있었습니다. 그래서 오늘은 Powershell 을 사용하여 알파벳 대소문자를 찍는 방법에 대해서 소개를 해 보려고 합니다.

아시는 바와 같이 알파벳 대문자 A는 아스키코드로 65고~ 소문자 a는 97 부터 시작을 하게 됩니다. A부터 Z까지 전체 알파벳은 26 개 이므로 시작하는 숫자로 부터 26개를 찍어주면 될 것입니다.



코드는 아래와 같고~

Powershell 에서 실행해 보면 아래와 같이 알파벳 대소문자가 찍히는 것을 확인할 수 있습니다.



Windows Powershell 사용시 regular expression 을 사용하면 텍스트 처리시 정말 다양한 것들을 자동화 할 수가 있습니다.

Powershell regular expression 관련하여 검색을 하다 보니, 아래 주소에서 Powershell regular expression 관련 좋은 글을 발견 할 수 있었습니다.

https://powershellexplained.com/2017-07-31-Powershell-regex-regular-expression/#regex-matches

그 중에서 Powershell 에서만 사용할 수 있는 굉장히 특이한 사용법에 대해서 소개하려 합니다. 보통의 다른 언어에서 switch case 를 사용하는 경우 정확하게 매칭이 되는 경우에만 사용됩니다. 그런데 Powershell 에서는 특이하게도 switch case 에서 regular expression 을 사용할 수 있더군요. Powershell 에서 get-help about_Switch 명령을 통해 메뉴얼을 살펴보면 Regex 옵션을 주면 switch 의 입력에 대해 정규 표현식 매칭을 하고 그에 따른 동작을 하게 된다는 것을 알 수 있습니다.

위 주소의 글에 있는 예제를 실행해 보면~ 아래와 같이 정규 표현식을 사용하여 숫자 형식에 따른 구분을 할 수 있다는 것을 알 수 있습니다.



Windows 를 사용하면서 많은 사람들이 Powershell 이라는 툴이 있는지 조차도 모르는 것 같더군요. 계속해서 말씀을 드리지만 Windows 에서 Powershell 을 사용하면 정말 다양한 작업들을 자동화 할 수가 있고~ 그만큼 생산성 향상 되는 것을 느끼실 수가 있을 겁니다.

저는 집에서 Windows 7 PC 한대와 Windows 10 PC 를 한대 사용하고 있는데~ Windows 7 PC Powershell 에서 아래와 같이 타이핑 해서 버전을 확인해 보니~ 2.0 버전이었습니다.

$PSVersionTable

그래서 Windows 7 Powershell 을 업데이트 하는 방법에 대해서 검색을 해 보니 오늘 아래 주소에서 확인할 수가 있었습니다.

https://www.microsoft.com/en-us/download/details.aspx?id=54616

Download 버튼을 누르고~ 아래와 같이 다운로드할 프로그램을 선택하고 설치해 주시면 됩니다.

다 설치를 했으면 윈도우를 재부팅하고~ Powershell 을 다시 실행 시키면 아래와 같이 5.1 버전으로 업데이트가 된 것을 확인할 수 있습니다.

아래 포스팅에서 Windows cmd 창과 관련된 다양한 명령어들에 대해서 소개한 적이 있는데~

https://iamaman.tistory.com/1241

https://iamaman.tistory.com/831

Windows command 창의 내용을 클립보드에 복사 하기 위해서 clip 이라는 명령어를 사용하곤 했습니다. 그런데 Powershell 5.1 버전으로 업데이트 하고 나서 Powershell 에서 clipboard 의 내용을 가져 올 때는 Get-Clipboard 클립보드에 Powershell 의 내용을 복사 할 때는 Set-Clipboard 라는 명령어를 사용할 수가 있었습니다.

Windows Powershell 이 계속해서 발전하는 모습이 정말 보기 좋네요~ 앞으로 세상은 극단적인 생산성 향상의 시대가 될 것이라고 생각을 합니다. Windows Powershell 과 함께 생산성에 있어서 앞서 나가시기 바랍니다.



Windows 환경에서 Powershell 을 사용하면 정말 다양한 PC 작업들을 자동 할 수 있습니다. 저는 업무를 비롯해 집에서 영화나 음악 파일 관리를 할 때도 Powershell 스크립트를 자주 사용합니다.

그런데 오래 걸리는 작업이 있다면 Powershell 스크립트가 실행되는 시간을 알고 싶은 경우가 종종 있습니다. 그래서 오늘은 Powershell 다른 스크립트 실행 시간을 측정하는 방법에 대해서 소개하려 합니다.

코드는 아래와 같이 굉장히 간단하고 측정하고자하는 스크립트 위아래에 Get-Date commandlets 을 넣어서 그 차이를 계산 하는 방법입니다.



위 Powershell 코드에서 시간 차이를 담고 있는 $timeSpan 변수를 찍어 보면 아래와 같이 다양한 시간 간격에 대해서 표시할 수 있습니다. 위 코드에서는 TotalSeconds 변수를 사용하여 초 단위로 표시를 했습니다.




개발을 하면서 소프트웨어 버전과 같은 특수한 목적으로 Ascii Code 를 많이들 사용하곤 합니다. 오늘은 Powershell 을 이용하여 Ascii Code 를 알아내는 방법에 대해서 소개하려 합니다

Powershell 에서 문자열을 char 배열로 바꾸기 위해서 ToCharArray() 멤버 함수를 사용합니다. 전체 코드는 아래와 같고~





위 코드에서 {0:X2} 부분은 두 자리 헥사값을 얻기 위한 과정이고~ [byte][char] 는 Ascii Code 를 얻기 위한 과정입니다.

세 번째 줄은 해도 되고 안 되지만 얻어진 헥사값의 순서를 뒤집기 위한 과정입니다.

다른 스크립트 언어도 그렇지만 Windows 환경에서 Powershell 은 정말 다양한 기능이 있는 것 같고~ Powershell 을 사용하느냐 하지 않느냐에 따라서 생산성이 극단적으로 갈리게 되는 거 같습니다. 많은 분들이 Powershell 을 업무에 적극적으로 활용해 보셨으면 합니다.



Powershell 을 사용하여 빌드 스크립트를 만들다 보니 쌍을 이루는 구조체를 만들어야 하는 경우가 종종 있었습니다. 그래서 Powershell struct 를 찾아보다가 Python 에서 사용하는것 처럼 tuple 을 사용 하는게 편하겠다는 생각이 들어서 검색을 해 봤습니다.

Powershell 에서 역시 Python 과 마찬가지로 tuple 타입을 사용할 수 있었고 아래 포스팅에서 그 사용법을 알 수가 있었습니다.

https://devblogs.microsoft.com/scripting/using-a-tuple-in-powershell/

간단하게 정리하면 아래와 같이 [System.Tuple] 이라고 써주고 정의하면 되는 것이었습니다.

[System.Tuple]::Create("Flintstone", "Rubble", "Dino")

Powershell 에서 대괄호[] 를 사용하는 경우는 .NET Framework class를 사용하는 것입니다. 즉 Powershell 에서 System.Tuple .NET Framework class 를 사용하여 tuple 타입을 사용할 수 있는 것입니다.



많은 분들이 많이 사용하고 있을 것 같은데~ Windows 탐색기에는 미리보기 기능이 있습니다. 파일을 열기 전에 미리 보기를 해서 자신이 원하는 파일을 확인하는 방법이죠.

굉장히 많은 파일 내에서 자신이 원하는 컨텐츠가 들어 있는 파일을 눈으로 확인하고 찾고 싶을 때 꼭 필요한 기능이라고 할 수 있습니다. 텍스트 파일을 비롯해서 이미지, 마이크로소프트 오피스 파일등 다양한 파일 형식에 대해서 미리 보기를 할 수가 있는데~ 이상하게 Windows Powershell 파일에 대해서는 미리 보기가 되지 않더군요. 그래서 검색을 조금 해보니 저와 같은 의구심을 가지고 있는 사람들이 많이 있었고 해결 방법 역시도 있었습니다.

Powershell 관련 파일 확장자는 ps1, psm1, psd1 이렇게 세 개인데~ 해당 파일들을 윈도우 미리보기가 되게 하기 위해서는 아래 주소의 레지스트리에 확장자 별로 키를 추가해야 되더군요.

HKEY_CURRENT_USER\Software\Classe

저한테는 너무 귀찮은 일이기 때문에 한 번에 해 주는 스크립트를 찾아 보니 역시나 있었습니다. 해당 스크립트는 제 gist 에 올려놨고~ 아래 스크립트를 다운로드 받아서 사용하면 됩니다.

git 을 사용 하시는 분이라면 아래 명령어를 통해서 다운로드 받을 수 있습니다.

git clone https://gist.github.com/ssgkd/06a57d14eeceaa28e0e1c9a8cab13a71

Powershell 을 관리자 권한으로 실행한 후에 다운로드 받은 Powershell 파일을 실행해 주면 아래와 같이 Powershell 파일에 미리보기가 가능한 것을 확인할 수 있습니다.



Powershell 에서 XML 파일을 파싱하는 경우 아래와 같이 두가지 방법을 사용할 수 있습니다. 첫번째는 System.Xml.XmlDocument 타입을 사용하는 방법이고 두번째는 Select-Xml commandlets 을 사용하는 방법입니다.

1. System.Xml.XmlDocument 을 사용하는 방법

[xml]$cn = Get-Content "XML_PATH"

$links = $cn.SelectNodes('//linkedResources/link')

2. Select-Xml 을 사용하는 방법

$links2 = Select-Xml -path "XML_PATH" -XPath '//linkedResources/link' | Select-Object -ExpandProperty Node

Select-Xml 에 대한 자세한 사용방법을 확인하기 위해서는 아래 메뉴얼을 참조하시거나 Powershell 에 Get-Help Select-Xml -Detailed 라고 명령하면 메뉴얼을 확인 할 수 있습니다.

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-xml?view=powershell-6

두 가지 방법 모두 XML_PATH 파일에 대해 XPath 의 형태로 각 node 에 접근 할 수 있고 $links, $links2 를 확인해 보면 같은 결과라는 것을 확인 할 수 있습니다.



아래 포스팅에서 소개한 바와 같이 Windows 10 을 사용하면서 다양한 레지스트리의 값을 수정해야 하는 경우가 종종 있었습니다.

http://iamaman.tistory.com/2610

http://iamaman.tistory.com/2591

이런 경우에 보통 regedit 명령을 통해 레지스트리 편집기를 실행하고 일일이 해당 키를 찾은 후에 값을 변경해 줘야 했습니다. 그런데 이런 방법은 사람이 일일이 확인하는 것이기 때문에 실수의 여지가 있고~ 변경해야 할 레지스트리가 많은 경우에는 불편한 것이 사실입니다.

레지스트리 변경 작업이 많다면 Powershell 을 통해서 자동화 하는게 좋을 것입니다. Powershell 을 통해 레지스트리를 변경하기 위해서는 관리자권한으로 파워쉘을 실행해야 합니다.

그리고 아래와 같이 set-itemproperty 명령어를 통해 해당 패스의 각 값들을 변경해 줄 수 있습니다. 윈도우 업데이트 등을 통해 레지스트리 값이 리셋 되는 경우가 종종 있는데~ 이러한 경우 일일이 레지스트리 편집기에서 찾아서 변경해 주는 것보다~ 훨씬 더 빠르고 정확하게 레지스트리 값을 변경해 줄 수 있을 겁니다.

set-itemproperty -path hklm:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -name EnableLUA -value 0

set-itemproperty -path hkcu:\Software\Elantech\SmartPad -name DisableWhenType_Enable -value 0

참고로 이렇게 긴~~ 외우기 어려운 명령어들은 아래 포스팅에서 소개했던 오토핫키 툴인 TypingAid, Autocomplete 등을 사용하여 저장해 놓고 사용한다면 훨씬 더 편리하게 사용할 수 있을 겁니다.

http://iamaman.tistory.com/1318

http://iamaman.tistory.com/1142



기존에 저는 파이썬에서 selenium 을 사용하여 제가 필요한 웹관련 자동화를 해 왔습니다. 제 블로그에 일주일에 한 번씩 올라가는 로또 관련한 포스팅이나 매일 하고 있는 종목 검색 포스팅 등은 파이썬을 사용하여 Tistory Open API 로 포스팅이 되고 있습니다. 최근에 아래 포스팅에서 Autohotkey 에서 selenium 사용에 대해 소개 한 적이 있었는데, 파이썬에서 사용하던 method 이름과 조금 다르더군요.

http://iamaman.tistory.com/2021

그래서 오늘은 COM 객체 사용시 사용 가능한 함수 및 속성을 알아내는 방법에 대해서 소개하려합니다. 현재 자신의 컴퓨터에서 사용 가능한 COM 객체를 알고 싶은 분들은 아래 주소의 글을 참조해 보시기 바랍니다.

http://iamaman.tistory.com/2215

COM 객체 사용시 사용 가능한 함수 및 속성은 COM Object 의 멤버를 찾으면 되는 것입니다. 저는 현재 Autohotkey 에서 selenium 을 사용하여 chrome 을 자동화하고 있습니다. 그래서 selenium 의 함수 및 속성 을 찾아보려 합니다.

간단하게 Powershell 에서 아래와 같이 코딩하고 실행하면

$se = New-Object -ComObject Selenium.CHROMEDriver

$se | Get-Member

다음과 같이 사용 가능한 멤버 함수 및 속성의 목록을 확인할 수 있습니다.

확인을 해보니 Python 에서 selenium 을 사용할때는 멤버 함수 명이 소문자였고 언더바(_) 로 구분되는 형태였는데 Autohotkey 에서 selenium 을 사용할때는 그렇지가 않군요. 예를 들면 Python 에서는 find_element_by_id() 였다면 Autohotkey 에서는 FindElementById() 의 형태네요.



Windows 에서 파일을 관리 하는 경우 Powershell 을 사용하면 매우 편리합니다. 대부분의 파일 작업은 반복되는 작업인 경우가 많습니다. 이런 작업들을 Powershell 스크립트로 한번 작성 해 놓고 반복해서 사용한다면 매우 편리 할 것입니다.

요즘 많은 분들이 컴퓨터를 사용하여 드라마를 다운로드 받아서 볼 텐데 동일한 드라마에 대한 여러 해상도의 파일을 다운로드 받는 경우가 종종 있습니다. 이런 경우 저는 낮은 해상도의 파일은 지웁니다.

아래는 중복된 파일이 있는 경우의 예입니다. E06 회차의 드라마에 대해 1080p, 720p 의 드라마가 중복되는 것을 확인 할 수 있습니다. 이런 경우 저는 높은 해상도의 파일은 남겨 놓고 낮은 해상도의 파일은 지웁니다.

[tvN] 나의 아저씨.E06.180405.1080p-NEXT.mp4

[tvN] 나의 아저씨.E06.180405.720p-NEXT.mp4

이를 위한 Powershell 스크립트는 아래와 같습니다. 아래 파일에서 ‘드라마폴더경로’ 부분만 본인의 폴더 경로에 맞도록 수정후에 실행하면 될 겁니다.


이전 포스팅에서 C# 으로 만들어진 DLL 을 Autohotkey 에서 사용하는 방법에 대해 알아 봤는데요. 

http://iamaman.tistory.com/2042

오늘은 C# 으로 만들어진 DLL을 Powershell 에서 사용하는 방법에 대해 알아보려 합니다. 

예제를 위한 C# 코드는 아래와 같습니다. 위 포스팅에서의 예제와 다른 점이라면 static 함수가 있다는 겁니다.



-test.cs-


using System;

namespace myDLL

{

public class Calculator

{

public static int  Sub(int a, int b)

{

return a - b;

}

public int Add(int a, int b)

{

return a + b;

}

public int increase(int var)

{

var++;

return var;

}

}

}

다음과 같이 C# 코드를 dll 파일로 빌드 합니다.

csc.exe /target:library test.cs


이렇게 만들어진 dll 파일을 Powershell 에서 로드하기 위해 아래와 같이 명령 합니다.

Add-Type -Path "DLL 파일 path"   

EX ) Add-Type -Path "E:\workspace\2017-12-27\test.dll"


이제 위에서 만든 dll 이 로드 됐으므로 myDLL namespace 의 Calculator 클래스를 사용할 수 있습니다. 

Powershell 에서 static 함수 호출은 아래와 같이 합니다.

[myDLL.Calculator]::Sub(2,3)

-1

다음으로 멤버 함수를 불러오기 위해서는 instance 를 생성 한 후에 호출 해 주면 됩니다. Powershell 코드는 아래와  같습니다. 

$test = New-Object -TypeName myDLL.Calculator

$test.Add(2,3)

5

Powershell 에서 전체 실행은 아래와 같습니다.



아래 포스팅에서 Find and Replace tool 에 대해 소개한 적이 있습니다.


폴더내의 텍스트들에 대해 찾기 바꾸기를 편리하게 할 수 있는 프로그램인데 코드 수저이 많이 사용하곤 합니다. 

그런데 최근에 UTF8 파일에 대해 Find and Replace tool 을 적용하는 과정에서 약간의 문제가 있었습니다. 

utf8 without BOM 으로 되어 있는 파일이었는데 Find and Replace tool 을 사용하여 파일을 변경하니 엉망으로 변하더군요. 

다행히 백업 본이 있어서 복구 할 수 있었지만 백업본이 없었다면 정말 큰 문제가 발생할 번 했습니다. 

utf8 without BOM 으로 된 파일들이 많아서 일일이 변경하기엔 문제가 있다는 생각이 들었고 그래서 Powershell 을 사용하여 자동으로 바꾸는 스크립트를 만들어 봤습니다. 

코드는 다음과 같습니다. 


save-UTF8withBOM  함수는 utf8 with BOM 파일로 만들어주는 함수이고 

save-UTF8withoutBOM  함수는 utf8 without BOM 파일로 만들어주는 함수입니다. 

argument 로 변경하고자 하는 파일의 path 를 넣어 주면 됩니다.
Powershell 사용시 ConvertFrom-String 이라는 명령어가 있습니다. 

ConvertFrom-String  은 String 열로부터 규격 화된 객체를 얻어 내는 명령어 입니다. 

현재 제 Windows 는 윈도우 7 이고 기본으로 들어 있는 Powershell 은 2.0 버전이더군요. 

Powershell 버전은 아래 명령어를 통해 확인 할 수 있습니다.

PS C:\> $host.version   

ConvertFrom-String 은 v5.0 이상에 들어있는 것 같습니다.

그래서 아래 주소에서  v5.0 버전을 다운로드 받았습니다.


제 컴퓨터는 Windows 7 64 비트라서 다운로드 버튼을 누른 후에 Win7AndW2K8R2-KB3134760-x64.msu 파일을 다운로드 받았습니다. 

설치 과정은 그냥 다음 다음이니 쉽게 설치 할 수 있을 겁니다. 

사용법 및 용도는 아래 명령어를 통해  ConvertFrom-String 명령어의 예를 보면 쉽게 이해 하실 수 있을 겁니다.

get-help ConvertFrom-String -Detailed

get-help ConvertFrom-String -Examples

저는 아래 포스팅에서 소개했던 Google Drive 로 Command Line 을 사용해서 백업 하는 경우


drive list  의 결과는 String 형태로 나오는데 이를 파싱하는 용도로 주로 사용 합니다.

$a = drive list | ConvertFrom-String
$temp = $a | where {$_.P2 -eq "test.zip"}
if ($temp)
{
  drive delete -i $temp.P1
}


Powershell을 사용하여 파일 관리를 하면 여러모로 편리한 것들이 많이 있습니다.

오늘은 지지난주 이전의 특정 파일들을 지우는 스크립트를 작성해 볼까 합니다.

저는 특정 메모들을 다음과 같이 D:\MEMO_JKD.txt 라는 형태로 저장하곤 합니다.

그리고 하루에 한번씩 이 MEMO.txt 파일을 날짜를 붙여서 20170210_MEMO.txt 와 같이 백업해 놓습니다.

시간이 지나면 지날 수록 해당 메모 파일들은 양이 계속 늘어 나겠죠.

그래서 이주 정도가 지난 메모 파일은 지우곤 합니다.

이러한 경우 다음과 같이 Powershell 스크립트를 작성해서 사용 할 수 있습니다.

$dayofweek = [int](Get-Date).DayOfWeek
$weekAgoDate=(Get-Date).AddDays(-($dayofweek+7))
gci D:\* -Include *MEMO.txt | ? {$_.Name -match '\d_MEMO.txt' -and $_.LastWriteTime -lt $weekAgoDate} | Remove-Item -Force


위 스크립트는 현재 사용하고 있는 MEMO.txt 파일은 지우면 안되므로 이름 앞에 숫자가 들어간 메모파일들 중에 이주 이상된 파일들을 지우는 스크립트 입니다.

요즘은 많은 분들이 TV 프로그램을 다운로드 받아서 보실텐데 이런 방송 프로그램들도 위와 같은 스크립트를 통해 특정 시간이 지난것들은 제거 해 주는 용도로도 사용 할 수 있을 겁니다. 


보통 Symbolic link 를 만드는 경우 mklink 라는 명령어를 사용하곤 한다. 


하지만 Powershell 에서는 mklink 명령어를 사용 할 수 없다.


Powershell 사용하여 Symbolic link 를 만드는 방법은 아래 모듈을 사용한다. 


http://zduck.com/2013/mklink-powershell-module/


아래와 같이 사용 할 수 있다. 


New-Symlink 링크 대상


Powershell 에서 다음과 같이 char에 대한 ascii 값을 확인 할 수 있습니다.


PS C:\Users\kdjang> [byte][char]'a'

97


PS C:\Users\kdjang> [byte][char]'z'

122


PS C:\Users\kdjang> [byte][char]'A'

65


PS C:\Users\kdjang> [byte][char]'Z'

90


위 값을 사용하면


a~z, A~Z 에 대란 리스트를 간단하게 만들 수 있겠죠~


$UpperAlph=@()

65..90|foreach-object{$UpperAlph+=[char]$_}

$UpperAlph



$LowerAlph=@()

97..122|foreach-object{$LowerAlph+=[char]$_}

$LowerAlph






Windows 에서 폴더 및 파일 관리시 비어 있는 폴더를 삭제 하고 싶은 경우가 있습니다.

 

그래서 저는 간단하게 빈폴더를 삭제하는 Powershell script 를 만들어서 사용하곤 합니다.

 

아래 소개한 powershell profile 에 작성해서 사용하면 조금더 편리하게 사용 할 수 있습니다.

 

http://iamaman.tistory.com/1017

 

스크립트는 아래와 같습니다. 그냥 하위 폴더는 그냥 두고 현재 폴더만 확인하고 싶은 경우와 빈 폴더만 확인하고 싶은 경우를 위해 recurse 와 Delete 를 옵션으로 줬습니다.

 

function emptyFolderFind

{

    param

    (

        $folder,

        [Switch]$Recurse,

        [Switch]$Delete

    )

 

    if($Recurse)

    {

        $a = Get-ChildItem $folder -Recurse | Where-Object {$_.PSIsContainer -eq $True}    

    }

    else

    {

        $a = Get-ChildItem $folder | Where-Object {$_.PSIsContainer -eq $True}

    }

    

    $b = $a | Where-Object {($_.GetFiles().Count -eq 0) -and ($_.GetDirectories().Count -eq 0)}

    $b | Select-Object FullName    

      

        

    if ($Delete -and $b)

    {

        $b | Remove-Item -Force

        Write-Host "Empty folder Deleted!!"

    }    

}

 

E:\workspace 하위의 폴더 중 빈폴더를 삭제 하기 위해서는 아래와 같은 명령어를 사용합니다. 

emptyFolderFind "E:\workspace" -Delete

 

하위 폴더도 검색하기 위해서는 Recurse 옵션을 주고 아래와 같이 Recurse 하게 검색 및 삭제 할 수 있습니다. 

emptyFolderFind "E:\workspace" -Delete -Recurse


오늘은 아래 포스팅에 이어서 powershell 을 이용하여 아웃룩에서 메일 보내는 방법에 대해 알아보려 합니다.

 

http://iamaman.tistory.com/1638



보통 회사에서 Microsoft Office 를 많이들 사용 하실 겁니다.

 

Powershell 에서는 Com Object 를 사용 할 수 있고~ Com object 를 사용하면 MS office 제품군에 대한 자동화가 가능 합니다.

 

따라서 outlook 도 자동화가 됩니다.

 

아래와 같이 간단하게 메일을 보낼 수 있습니다.

 

$textv =@"

메일 테스트 

메일 잘 가나요?

"@

 

$subject = "서버의 업데이트가 안 되었습니다."

 

$obj = New-Object -ComObject Outlook.Application

 

$newMail = $obj.CreateItem(0)

$newMail.Subject = "메일 제목"

$newMail.Body = $textv

$newMail.To = "메일 받는 사람 주소"

 

$newMail.Send()

 

 

Newmail Object 관련 Property 들은 아래 주소에서 확인 할 수 있습니다.

 

https://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.mailitem_properties.aspx

 

위와 같은 방법을 사용하면 반복적으로 메일을 보내야 할 때 매우 편하게 보낼 수 있을 겁니다.


Powershell 를 사용하여 드라이브를 다룰 때 Network Drive 를 다뤄야 하는 경우가 있습니다.

 

오늘은 Network Drive 가 특정 문자로 Mapping 이 되어 있을 때 ProviderName 을 찾는 방법에 대해 간단히 소개해 보려 합니다.

 

Powershell 에서 특정 드라이브의 형태를 알고 싶을 때는 Get-WmiObject Win32_LogicalDisk 라는 명령어를 사용합니다.

 

https://msdn.microsoft.com/en-us/library/windows/desktop/aa394173(v=vs.85).aspx

    

위 주소의 Win32_LogicalDisk 에 대한 매뉴얼을 확인 하시면 네트워크 드라이브는 DriveType 값이 4 라는 것을 확인 할 수 있습니다. 일반적인 local drive 는 DriveType 이 3 이고 RAM 은 6 이라는 것도 알 수 있습니다.

 

 

따라서 Network Drive 를 찾으려면 아래 명령어를 통해 DriveType 값이 4인 경우만 찾으면 됩니다.

 

Get-WmiObject Win32_LogicalDisk -filter "DriveType = 4"

   

처음에 찾고자 했던 ProviderName 뿐만 아니라 다음과 같이 DeviceID, DriveType, FreeSpace, Size, VolumeName 도 확인 할 수 있습니다. 

 

일을 진행한다 보면 매월 X 째 주 Y요일에 어떤 일을 처리해야 하는 경우가 있습니다.

 

이런 스케줄을 처리 할 때 당연히 이에 대해 계산하는 함수 등이 필요 할 겁니다.

 

오늘은 Powershell 을 사용하여 위에 얘기한 매월 X 째 주 Y요일을 찾아볼까 합니다.

 

고맙게도 아래 주소에 Powershell을 사용하여 매월 X 째 주 Y요일을 찾는 Get-WeekDayInMonth 라는 함수가 작성되 있더군요.

 

http://blog.tyang.org/2012/09/03/powershell-function-get-weekdayinmonth/

 

 


Function Get-WeekDayInMonth ([int]$Month, [int]$year, [int]$WeekNumber, [int]$WeekDay)

{

   

    $FirstDayOfMonth = Get-Date -Year $year -Month $Month -Day 1 -Hour 0 -Minute 0 -Second 0

      

    #First week day of the month (i.e. first monday of the month)

    [int]$FirstDayofMonthDay = $FirstDayOfMonth.DayOfWeek

 

    $Difference = $WeekDay - $FirstDayofMonthDay

 

    If ($Difference -lt 0)

    {

        $DaysToAdd = 7 - ($FirstDayofMonthDay - $WeekDay)

    } elseif ($difference -eq 0 )

    {

        $DaysToAdd = 0

    }else {

        $DaysToAdd = $Difference

    }

 

    $FirstWeekDayofMonth = $FirstDayOfMonth.AddDays($DaysToAdd)

 

    Remove-Variable DaysToAdd

 

    #Add Weeks

    $DaysToAdd = ($WeekNumber -1)*7

 

    $TheDay = $FirstWeekDayofMonth.AddDays($DaysToAdd)

 

    If (!($TheDay.Month -eq $Month -and $TheDay.Year -eq $Year))

    {

        $TheDay = $null

    }

 

    $TheDay.ToString("yyyy년 MM월 dd일")

}

 

위 주소의 원본 함수에서 년도 표기만 수정 했습니다.

 

위 함수의 입력 인자 중 WeekDay 는 X 째 주를 의미 합니다. WeekNumber 는 Y 요일을 의미 하며 일요일이 0 입니다.

 

따라서 월요일은 1, 화요일은 2 … 가 될 것입니다.

 

위에 소개한 Get-WeekDayInMonth 함수를 활용하여 2016 년 1월부터 12월 까지의 2째주 수요일을 찾아보겠습니다.

 

2째주 이므로 WeekDay 에 2 를 수요일이므로 WeekNumber 에 3을 입력 합니다.

 

다음과 같이 간단하게 코딩하면~ 결과를 얻을 수 있습니다.

 

$month = 1..12

 

$buffer =@()

 

foreach ($mon in $month)

{

      

    $fist = Get-WeekDayInMonth $mon 2016 2 3

 

    $buffer += $fist

}

 

$buffer

 

실행해보니 다음과 같은 결과가 나오네요.


Powershell 에서 다른 프로세스 실행시 일반 적인 경우 프로그램 실행 후에 powershell 의 다음 라인을 실행하게 됩니다.

 

하지만 경우에 따라서는 실행된 프로그램이 끝나고 powershell 의 다음 라인이 실행되어야 하는 경우가 있습니다.

 

이런 경우에는 다음과 같이 처리 하면 됩니다.


 <임의의 exe 프로그램> | Out-Null

Or

Start-Process <임의의 exe 프로그램> -Wait

 


첫번째 방법 보다는 Start-Process 를 사용하는 게 더 정석적인 방법으로 보이네요.



Powershell 의 Get-ChildItem 을 사용하여 파일 또는 폴더의 리스트를 얻을 때

 

해당 폴더 하위의 끝까지 검색을 하고자 할때는 –recurse 라는 옵션을 사용합니다.

 

그런데 특정 depth 까지만 검색을 하고자 하는 경우 \* 와 같은 키워드를 사용하기도 하지만

 

Get-ChildItemToDepth 라는 함수가 아래 주소에 있어서 소개하고자 합니다.

 

http://www.indented.co.uk/2010/01/22/limit-recursion-depth-with-get-childitem/

 

코드는 다음과 같습니다.

 

 

 

특정 폴더 이하의 D:\ 의 2 depth 까지 검색하는 방법은 다음과 같습니다.

 

get-childitemtodepth -Path "D:\*" -ToDepth 2



리눅스 등에서는 wc –ㅣ 명령을 통해 라인수를 세지만

   

Powershell 에서는 아래 명령으로 동일한 명령이 가능하다.

   

아래 명령은 현재 폴더 하위의 C 소스코드 및 헤더 파일의 라인수를 세는 스크립트이다.

   



Get-ChildItem .\* -Include *.c, *.h -Recurse | Get-Content | Measure-Object –Line

   

Measure-Object –Line 명령은 자동으로 공백을 제외하고 라인수를 세서 결과를 내 준다.

   

다음과 같이 profile.ps1 파일에 함수의 형태로 구성해서 사용하는게 편할 것이다.

   

function sourceLineCH {

Get-ChildItem .\* -Include *.c, *.h -Recurse | Get-Content | Measure-Object -Line

}

Set-Alias lch sourceLineCH

   

function sourceLineTXT {

Get-ChildItem .\* -Include *.txt -Recurse | Get-Content | Measure-Object -Line

}

Set-Alias lt sourceLineTXT

   

위 함수를 활용하면 ~

   

Powershell 에서 lch(line *.c, *.h) 라고 명령을 하면 c, h 확장자를 가진 파일들의 라인수를 세고, lt (line *.txt)라고 하면 txt 파일들의 라인수를 세 준다.

 

 


Powershell 에서 7z 을 사용할 때 7z.exe 명령어를 사용하면 정상적으로 동작을 하지 않는다.

 

따라서 다음과 같이 Powershell Profile 에 alias 을 설정하여 사용한다.

 

powershell profile 파일의 위치에 대한 확인 방법은 아래 글을 참조한다.

 

http://iamaman.tistory.com/1017

 

나는 보통 powershell 에서 아래 명령어를 통해 profile 을 설정한다. 아래 명령어를 실행해서 profile 이 없다면 새로 만들겠냐는 메시지가 나온다.

 

notepad $profile.CurrentUserAllHosts

 

powershell profile 에 다음과 같이 설정한다. 아래 명령어는 sz 라는 alias 로 만든 것이다.

 

set-alias sz "7z.exe의 path"

Example) set-alias sz "C:\Program Files\Bandizip\7z\7z.exe"

 

이제 powershell 을 재 시행하고 다음과 같이 7z 을 활용하여 압축을 할 수 있다. 아래 명령어는 D:\TEST 라는 폴더를 D:\TEST.zip 이라는 파일로 압축하는 예이다.

 

sz a D:\TEST.zip D:\TEST



윈도우 Powershell 코딩을 하면서 약간 아쉬웠던 부분이 바로 IDE 인데요

 

윈도우에는 Powershell 과 Powershell IDE 가 있는데 윈도우 Powershell IDE 의 경우엔 코딩을 하기에 약간 불편한 감이 있더군요.

 

Auto Complete 기능이나 자동 Formatting 과 같은 기능들이 아쉬운 부분이었습니다.

 

보통 저는 윈도우에서 Powershell 코딩을 할대는 Notepad++ 와 같은 에디터들을 사용하곤 했는데~

 

Notepad++의 Plugin들도 약간씩 아쉬운 감이 있더군요.

 

그래서 인터넷을 검색해 봤습니다.

 

Powershell IDE 프로그램 중에 Freeware 인 프로그램을 찾아보니 Powershell Plus가 나오더군요.

 

Powershell Plus 는 아래 주소에서 다운로드 할 수 있습니다.


 

http://www.idera.com/productssolutions/freetools/powershellplus


 

간단하게 이메일을 넣고~~

 

자신의 컴퓨터 환경에 맞게 다운로드 합니다. 저는 윈도우 7 64 비트 환경이라 x64 파일을 다운로드 받았습니다.

 

다운로드 받은 압축 파일을 압축 해제 하고~ IderaPowerShellPlusInstallationKit-x64.exe 파일을 실행하면 설치가 시작됩니다.

 

설치는 계속~ OK~ OK 이고~ 다음과 같은 화면이 나오면 Install 을 눌러 주면 됩니다.

 

License 와 관련된 화면에서는 당연히 Agree를 해 줘야 하겠죠~ 그 담부터는 또~~ OK~ OK 입니다.

 

설치를 하고 Powershell Plus를 실행하고CTRL + N 을 눌러서 Editor 창을 하나 열고Powershell 코등을 하면 됩니다.

 

for 를 타이핑 한 후에 CTRL+Space 를 눌러 보면~ 아래 그림과 같이 기본 Template이 써 집니다.

 

마치 Eclipse 에서 자바 코딩하는 것 같은 느낌이 들더군요. 또한 if를 타이핑 하고 CTRL+Space 를 누르면 역시 마찮가지로 Template 이 타이핑 됩니다.

 

일반적인 명령어들도 위 그림과 같이 get- 까지 타이핑 한 후에 CTRL+Space를 누르면 입력할 수 있는 명령어들이 나열 됩니다.

 

윈도우 Powershell IDE 에서 가장 아쉬웠던 부분인 Autoformat 기능도 있습니다. 아래 그림과 같이 오른쪽 클릭후에~ Autoformat 을 누르면~ 코드가 예쁘게 정렬됩니다.


 

그 밖에도 Powershell 코드들을 라이브러리화 해서 관리 할 수도 있고~ 너무 좋더군요.

 

Powershell 코딩을 많이 하시는 분들은 적극적으로 활용해 보시면 좋을 것 같네요.


Powershell 에서 현재 스크립트 파일의 디렉터리의 path 를 구하는 방법은 아래 코드와 같다.

 

function Get-ScriptDirectory

{

$Invocation = (Get-Variable MyInvocation -Scope 1).Value

Split-Path $Invocation.MyCommand.Path

}

 

Get-ScriptDirectory 함수를 profile 함수 등에 저장해 놓고 사용하거나

 

해당 스크립트의 상단에 정의해 놓고 사용 가능하다.

 

다음과 같이 사용하면 현재 Powershell 스크리브 파일의 path 가 나온다.

 

function Get-ScriptDirectory

{

$Invocation = (Get-Variable MyInvocation -Scope 1).Value

Split-Path $Invocation.MyCommand.Path

}

 

$CurrentPath=Get-ScriptDirectory

echo $CurrentPath

 

 

위 코드에서의 myinvocation 과 같은 변수에 Powershell 에 미리 정의되어 있는 PowerShell Predefined Variables 이며 그 이외의 다양한 변수는 아래 주소를 참조하기 바란다.

 

http://xahlee.info/powershell/automatic_variables.html



리눅스 쉘을 사용해 보신 분들이라면~

 

cd - 라는 명령을 통해서 바로 직전의 directory 로 돌아갈 수 있는걸 알고 계실 겁니다.

 

그런데 powershell 에서는 cd – 가 동작하지 않아서 약간 불편 하더군요.

 

그래서 찾아보니 cd – 를 동작하도록 하는 스크립트가 있더군요.

 

원본 포스팅은 맨 아래의 참고자료에서 확인 하실 수 있습니다.

 

코드는 다음과 같습니다.

 

Remove-Item Alias:cd

 

function cd {

 

if ($args[0] -eq '-') {

     $pwd=$OLDPWD;

}

else {

     $pwd=$args[0];

}

 

$tmp=pwd;

    

    if ($pwd) {

        Set-Location $pwd;

    }

    

    Set-Variable -Name OLDPWD -Value $tmp -Scope global;

}

 

 

위 코드를 powershell profile 에 넣어주시면 끝입니다.

 

powershell profile 작성 방법은 아래 글을 참조해 주세요~


2013/10/16 - [programming language/powershell] - Powershell profile 적용 및 alias


 

그럼 사용 예를 한번 살펴 볼까요~


 


참고자료


http://windows-powershell-scripts.blogspot.kr/2009/07/cd-change-to-previous-working-directory.html

 


윈도우에 Powershell 이 추가 되면서 스크립트 작성이 굉장히 편리해졌는데요~

 

Powershell 에서도 리눅스 bash 에서와 마찬가지로 alias 를 비롯한 많은 설정들을 할 수 있습니다.

 

또한 이런 설정들을 .bashrc 파일에 설정하듯이 powershell 에서도 profile 파일에 설정할 수 있습니다.

 

profile 파일을 사용하기 전에 일단 Get-ExecutionPolicy 명령을 통해 현재의 ExecutionPolicy 설정 상태를 확입합니다.


 

파워 쉘 스크립트를 한번도 실행안한 경우에는 Restricted로 보통 설정되어 있는데요~

 

아래 명령을 통해 스크립트가 실행 가능하도록 해 줍니다.


Set-ExecutionPolicy RemoteSigned

 

다른 실행 정책들에 대해서는 아래 명령을 통해 확인 할 수 있고~


get-help about_execution_poicies

 

Restricted 이외에 다음과 같은 실행정책이 있으니~ 참조하시기 바랍니다.


 

이제 profile 파일의 설정 위치를 확인 해 봐야죠~

 

powershell 에서는 아래 명령을 통해 설정파일의 위치를 확인 할 수 있습니다.


$PROFILE | select *

 

위 명령을 치면 아래 그림과 같이 네 개의 path 가 나오는데요~


 

AllUsers 는 모든 사용자 CurrentUser 는 현재 사용자 입니다.

 

다음으로 AllHosts 와 CurrentHost 인데요. powershell 은 두 개의 호스트가 존재합니다. 하나는 그냥 Powershell 이고 하나는 powershellISE 입니다.

 

현재 사용자에 대해 Powershell 과 ISE 에 동시에 적용하기 위해서는 $profile.CurrentUserAllHosts 에 설정을 하면 됩니다.


 

$profile.CurrentUserAllHosts 파일이 작성되어 있는지 확인을 하려면~ 다음과 같이 명령을 하면 되고~


Test-Path $profile.CurrentUserAllHosts



아래 명령을 통해 파일을 만들어 주면 됩니다.


notepad $profile.CurrentUserAllHosts

 

파일이 없는경우에는 새 파일을 만드시겠습니까? 라는 메시지가 나오는데~ 를 눌러주시면 됩니다.

 

이렇게 만들어진 profile 파일에 자신이 작성하고자 하는 alias 나 사용자 함수 등을 작성해서 사용할 수 있습니다.


 

alias 명령어는 아래 명령을 통해 파일로 내보내기를 할 수 있습니다.


Export-Alias -Path 파일명


 

내보낸 alias 명령어 들은 아래 명령을 통해 들여오기를 할 수 있습니다.


Import-Alias -Path 파일명

 


참고 자료

 

http://jdhitsolutions.com/blog/2009/11/get-profiles/

 

http://www.powershellpro.com/powershell-tutorial-introduction/tutorial-powershell-aliases/




실험을 하다 보면 경우의 수의 조합들을 다 구해서 실험을 해야 하는 경우가 있습니다.

 

이러한 조합의 경우의 수를 구하는 것을 Cartesian Product 라고 하는데요.

 

단순히 생각하면 Cartesian Product 를 구하기 위해서는 for 문을 계속 중첩해서 사용해야 하지만 이게 두~세개만 넘어가도 굉장히 헷갈리고 힘든일이 됩니다.

 

이러한 경우 Cartesian Product 를 구하는 함수를 만들어 놓고 사용한다면~ 굉장히 편리하죠~

 

저는 Powershell 에서 Cartesian Product 를 구해야 하는 경우가 있었는데~ 아래 주소에 그 코드가 있더군요. 좋은 코드 같아서 여러분들께도 소개하려 합니다.

 

코드 출처 : http://makeyourownmistakes.wordpress.com/2012/04/17/simple-n-ary-product-generic-cartesian-product-in-powershell-20/

 

function CartesianProduct

{

$returnValue = @()

foreach ($parameter in $MyInvocation.UnboundArguments)

{

$returnValue = AddToAll $returnValue $parameter

}

return $returnValue

}

 

function AddToAll($currentResult, $valuesToAdd)

{

$returnValue = @()

if ($valuesToAdd -ne $null)

{

foreach ($value in $valuesToAdd)

{

if ($currentResult -ne $null)

{

foreach ($result in $currentResult)

{

$newResult = @($result)

$newResult += ,$value

$returnValue += ,$newResult

}

}

else

{

$returnValue += ,$value

}

}

}

else

{

$returnValue = $currentResult

}

return $returnValue

}

 

$values1 = @("html", "csv", "email")

$values2 = @("1", "7", "14")

$values3 = @("12", "24")

$values4 = @("server1.mydomain.com")

$product = CartesianProduct $values1 $values2 $values3 $values4

 

위 코드를 실행시켜보면~ $product 에는 $values1 ~ $values4 의 모든 경우의 수의 조합이 다 생성되서 들어가게 되고~

 

$product 의 각 인자들은 아래와 같습니다.


 

$product[0], $product[1]… 의 각 값들은 –split 를 이용해서 나눌수가 있으며 아래와 같이 $c 변수의 인덱스를 이용해서 접근 할 수 있습니다.


+ Recent posts