Autohotkey 를 사용하여 특정 폴더에 있는 특정 확장자의 파일 수를 세기 위해 함수를 하나 만들어 봤습니다. Autohotkey 에서는 Loop 문을 통해 특정 확장자 파일 모두에 대해 접근을 할 수 있고 루프를 돌 때마다 A_Index 값이 증가 합니다. 이를 사용하면 파일의 갯수를 셀 수 있습니다. 다수의 특정 확장자 입력을 받을 수 있도록 했습니다.

코드는 다음과 같습니다.






위 코드중 제가 만든 함수는 fileCount() 이고 다음과 같이 폴더와 확장자를 지정하면 해당 폴더에 있는 특정 확장자의 갯수가 몇개인지를 알려 주는 함수 입니다. 확장자는 여러개를 순차적으로 넣으면 되고 아래 예에서는 jpg, png 파일을 찾도록 한 것입니다.

directV=C:\testFolder

N_Files := fileCount(directV, "jpg", "png")

그런데 검색을 조금 해 보니 특정폴더에 파일 개수를 찾기 위해서 Windows COM 을 사용하는 방법도 있더군요. Scripting.FileSystemObject, Shell.Application 등을 사용하는 방법이었으며 해당 방법들을 사용해도 동일한 결과를 얻을 수 있습니다. COM 을 사용하는 예에서 Shell.Application 을 사용하여 Item 의 갯수를 찾는 경우 숨김폴더는 제외한 갯수를 알려 주더군요.



요즘 네이버 댓글 조작 사건으로 인해서 정치권이 시끄럽습니다. 드루킹 일당이 매크로 프로그램을 사용하여 대한민국 국민들이 가장 많이 사용하고 있는 포털인 네이버 기사의 댓글을 조작했다는 사건입니다. 네이버 댓글 조작 사건으로 인해서 보수 정당에서는 특검을 요구하고 있고 자유한국당의 김성태 원내대표는 최근까지 단식을 했었죠. 저는 개인적으로 댓글을 잘 안 봐서 이게 왜 이렇게 문제가 되나라는 생각을 했었는데, SBS 뉴스토리를 확인해 보니 많은 사람들이 댓글을 확인하고 그에 대해서 직간접적으로 영향을 받는다고 합니다. 그런데 사실 개발자 입장에서 생각해보면 이런 댓글 조작은 뒤늦게 발견은 가능하겠지만 막을 수는 없을 것으로 생각됩니다.

SBS 뉴스토리 ‘디지털 함정 인터넷 여론 조작’편을 보다 보니 어떤 사이트에 아이디를 자동으로 만드는 프로그램이 소개 되더군요. 바로 오토핫키 였습니다.

방송에 출연한 개발자 분은 scite4autohotkey 에디터 환경에서 Autohotkey 를 사용하여 한 사이트에 자동으로 회원에 가입하고 아이디를 만드는 데모를 보여주더군요. 방송에서는 이런 프로그램을 만드는데 한 30분 정도면 된다라고 소개를 했었는데 그마만큼 Autohotkey 는 생산성이 정말 좋은 언어라고 생각 합니다. 아래 화면과 같이 데모를 위한 간단한 GUI 프로그램도 단 몇 분만에 만들 수 있습니다.

방송에서는 Autohotkey 의 아주 일부 기능만 소개를 했는데 사실 오토핫키는 윈도우 환경에서 정말 많은 것들을 자동 할 수 있습니다. COM(Component Object Model) 도 사용할 수가 있어서 Microsoft Office 제품들도 자동화 가능하고~~

http://iamaman.tistory.com/458

http://iamaman.tistory.com/1625

http://iamaman.tistory.com/1996

아래 포스팅에서 소개한 바와 같이 이베스트증권에 xingAPI 를 사용하여 시스템 트레이딩에도 사용할 수가 있습니다.

http://iamaman.tistory.com/2224

저 개인적으로는 현재의 Autohotkey 는 수치 연산 분야를 제외한 대부분의 분야에서 효율적으로 사용이 될 수 있을 것이라고 생각됩니다.

윈도우 컴퓨터를 사용하는 많은 분들이 Autohotkey 를 사용해 보셨으면 하고 오늘부터 한번 공부 해 보시는 건 어떨까요? 여러분들의 컴퓨터 사용 업무 생산성이 팍팍 증가하는 것을 느낄 수 있을 겁니다.



기존에 저는 파이썬에서 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() 의 형태네요.



아래 포스팅에서 Autohotkey 에서 Windows COM(Component Object Model) 을 사용한 사례에 대해서 소개를 한 적이 있습니다. Windows 컴퓨터 사용시 많이들 사용하는 Microsoft Office 제품을 사용할 때도 COM 을 사용하여 자동화를 할 수가 있습니다.

http://iamaman.tistory.com/1879

http://iamaman.tistory.com/461

http://iamaman.tistory.com/2001

http://iamaman.tistory.com/2021

Autohotkey 에서 COM 을 사용하기 위해서는 아래 메뉴얼 같이 COM object 를 만들어야 합니다.

https://autohotkey.com/docs/commands/ComObjCreate.htm

ComObjCreate의 입력값으로 CLSID 를 넣어줘야 하는데 CLSID 는 우리가 사용하고자 하는 COM 의 Program ID 입니다.

ComObject := ComObjCreate(CLSID [, IID])

탐색기 정보 등을 자동화 하고 싶으면 Shell.Application, Microsoft Word 를 자동화하고 싶으면 Word.application, Microsoft Powerpoint 를 자동화 하고 싶으면 PowerPoint.Application 을 넣어야 하는 식입니다.

COM 을 사용하기 위해서는 당연히 우리 컴퓨터에 사용할 수 있는 COM 이 어떤게 설치가 되어 있는지를 알아야 합니다. Microsoft Office 제품과 같이 우리가 설치한 경우에는 당연히 알 수 있겠지만 다른 프로그램들 같은 경우에는 어떤 이름을 사용해야 COM 을 사용할 수 있는 건지 잘 모르는 경우가 많습니다.

그래서 오늘은 Powershell 을 사용하여 우리 컴퓨터에 설치되어 있는 COM 을 검색하는 방법에 대해서 소개하려합니다. 해당 코드는 Powershell 코드이며 ‘개발자를 위한 Powershell’ 책의 예제에 있습니다.

책의 전체 소스 코드들은 아래 주소에서 다운로드 받을 수 있습니다.

https://github.com/dfinke/powershell-for-developers

그리고 아래 주소의 GetProgID 함수를 사용하면 우리 컴퓨터에 설치되어 있는 COM 을 검색할 수 있습니다.

https://github.com/dfinke/powershell-for-developers/blob/master/chapter10/GetProgID.ps1

Powershell 에서 다음과 같이 ps1 파일을 실행하면 되는데…..

.\GetProgID.ps1

내 컴퓨터에 몇 개의 COM 이 설치되어 있는지 확인을 해보려면 다음과 같이 명령어를 치면 됩니다. 제 컴퓨터에는 1800개 COM 이 있네요.

.\GetProgID.ps1 | measure


1800 개를 눈으로 확인하는 건 조금 불편 하니까 키워드로 검색하는 것이 좋습니다. 다음과 같이 word 를 검색해보면 Word.Application 뿐만 아니라 내가 잘 알지도 못하는 다양한 COM 들이 설치 되어 있다는 것을 알 수가 있습니다. 검색 되는 목록 중에서 Word.Application 을 사용 하면 되는 것이죠.

.\GetProgID.ps1 word


이베스트 xingAPI를 사용해서 시스템 트레이딩을 하시는 분들은 다음과 같이 검색해보시면 COM 이 나오는 것을 확인 하실수 있습니다. xingAPI 를 설치했으므로 검색이 되는 건 당연하겠죠.

.\GetProgID.ps1 XA_DataSet

.\GetProgID.ps1 XA_Session


저는 개인적으로 요즘 이베스트 xingAPI를 통해서 시스템 트레이딩을 조금씩 공부 해 보고 있는데, 컴퓨터 언어는 주로 파이썬을 사용하고 있습니다. 생각해보니 Autohotkey 나 Powershell 을 사용해서도 시스템 트레이딩이 가능할것도 같네요.



아래 포스팅에서 MATLAB, Powershell, Python 에서 Outlook  을 사용하여 자동으로 메일 보내는 방법에 대해 알아봤는데요.




오늘은 Autohotkey 에서 아웃룩을 사용하여 자동으로 메일 보내는 방법에 대해 알아보려 합니다.

코드는 아래와 같습니다.

textBody =

(

안녕하세요. 남성입니다.


메일 보냅니다.

)


tempAttach =C:\Attach.jpg


obj := ComObjCreate("Outlook.Application")

newMail := obj.CreateItem(0)

newMail.Subject := "메일 제목"

newMail.Body := textBody

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


myAttachments := newMail.Attachments

myAttachments.Add(tempAttach)


newMail.Send()

ObjRelease(newMail)

ObjRelease(obj)

위 코드에 대해 간단히 소개하면

tempAttach 에는 첨부파일의 path 를 넣습니다. 다수의 파일을 첨부하고 싶다면 세미콜론(;)으로 구분합니다.

newMail.Subject 에는 메일 제목을 넣고 

newMail.Body 에는 본문의 텍스트를 넣습니다. 보통 본문은 여러 줄로 작성하니 위 예와 같이 textBody 라는 변수를 하나 만들어서 여러 줄로 텍스트를 넣을 수 있습니다.

newMail.To 에는 받는 사람의 주소를 넣습니다. 받는 사람이 여럿일 때는 마찮가지로 세미콜론으로 구분합니다.

추가로 참조를 넣고 싶다면 newMail.Cc 에 참조자의 메일 주소를 넣으면 됩니다.

저는 Autohotkey 를 사용하여 시간이 걸리는 작업을 진행시 작업이 끝났다는걸 알리기 위해 아웃룩 메일을 자동화 하곤 합니다.


탐색기의 주소를 알고 싶은 경우 탐색기에서 ALT + D 를 누른 후에 주소 값을 복사 하면 됩니다. 

Autohotkey 로 탐색기의 주소를 알고 싶은 경우에도 위의 내용을 코딩해 주면 되겠죠. 


해당 내용은 아래와 같을 겁니다. 



send, !d
sleep, 1000
send ^c

그런데 클립보드를 사용하다 보면 이상하게 주소가 저장이 안 될 때가 있습니다. 

그래서 COM 을 사용해 보기로 했습니다. 

Autohotkey 에서 COM 을 사용하여 현재 열린 탐색기의 폴더 주소를 아는 방법은 아래와 같습니다.

#NoEnv
#SingleInstance force

#a::   ; Shortcut : WIN + A
hwnd := WinExist("A")
WinGetClass class, ahk_id %hwnd%

if (class="CabinetWClass" or class="ExploreWClass")
{

for window, in ComObjCreate("Shell.Application").Windows
{
try
{
if (window.hwnd==hwnd)
{
sel := window.LocationURL

sel := RegExReplace(sel,"file:///","")
foldername := RegExReplace(sel,"/","\")
foldername := RegExReplace(foldername,"%20"," ")

Clipboard:=foldername
MsgBox,,, % foldername,1

break
}
}
}
}
return

위 코드를 실행 시킨 후에 탐색기를 연 상태에서 WIN + A 를 누르면 아래와 같이 msgbox 가 1 초간 열렸다가 꺼지고 클립보드에 폴더의 주소가 저장 됩니다.




아래 포스팅에서 작성한 바와 같이 Autohotkey 를 사용하면 COM 을 사용한 작업들을 할 수가 있습니다.

http://iamaman.tistory.com/461

COM 을 사용한 대표적인 작업으로는 Internet explorer 를 비롯하여 Microsoft Office 등을 자동활 할 수 있는데요~

오늘은 Microsoft Office powerpoint 파일을 안 보이게 여는 방법에 대해 조금 소개해 보려 합니다.

보통 엑셀 등에서는 Application object 의 visible 필드의 값을 false 로 하면 파일이 열려 있지만 보이지는 않게 설정 할 수 있습니다.

그런데 powerpoint 에서는 약간 다르더군요.

아래와 같이 file open 시에 4번째 옵션에 false 로 주면 화면에는 보여주지 않고 powerpoint 파일을 열 수 있습니다.

powerpointFile=C:\abc.pptx
pptApp := ComObjCreate("PowerPoint.Application") ; create PowerPoint object 
Xl_Workbook := pptApp.Presentations.Open(powerpointFile,,,false) ; Visible False


Xl_Workbook.Close
pptApp.Quit() 



  1. 김민혁 2018.12.06 09:29

    안녕하세요 좋은 자료 감사히 잘 보고 있습니다

    혹시 인터넷에 첨부된 엑셀파일을 저장하지 않고 열기를 선택하여 활성화된 엑셀파일을 Comobj 명령어로 바로 접근할수 없겠습니까?

    • 남성 2018.12.06 19:07 신고

      현재 엑셀 파일이 열려 있고 해당 엑셀 파일의 COM object 에 접근하기 위해서는 ComObjActive 를 사용하면 됩니다.

      exCOM := ComObjActive("Excel.application")
      exCOM.visible := False


      아래 포스팅도 참고 하시길~

      http://iamaman.tistory.com/1996

  2. 김민혁 2018.12.07 10:53

    답변 주셔서 대단히 감사합니다. 제가 당면한 상황 하나를 더 설명을 못했네요
    저장하지 않은(첨부파일 여러개를 저장하지 않고 열기를 선택한)
    1개 이상의 엑셀파일을 별도로 통제하고 싶습니다


    1. 제가 관리하는 엑셀파일 하나가 실행되어 있는 상태이고
    ( xl:= comobjcreate("Excel.Application")
    xl.open(path) 를 사용하고 있습니다)

    2. 그 상황에서 인터넷에서 엑셀 첨부파일을 열어서(저장하지 않고)
    첨부파일의 데이터를 1번의 엑셀파일에 붙여놓고 싶습니다

    3.문제점
    1) 첨부파일의 엑셀파일을 활성화된 상태에서
    xl2:= comojbactive("Excel.application").ActiveWindow
    xl2.range("A1").copy
    위의 스크립트를 실행하면 range가 알수없는 이름이라고 에러가 뜨고요

    2)
    xl2:= comojbactive("Excel.application")
    xl2.range("A1").copy

    이렇게 실행하면 첨부파일이 아닌 기존1번의 엑셀파일의 A1을 복사합니다..





    인터넷에 찾아봤는데 좋은 예시가 있었으나 이것도 에러가 납니다
    고수님 제발 부탁드립니다 해법을 알려주십시오


    It's recommended to use oExcel := Excel_Get() instead of oExcel := ComObjActive("Excel.Application") to access the Excel object for a few reasons - when you use oExcel := ComObjActive("Excel.Application");
    • if there is more than 1 running Excel process, it will get the first registered on the ROT (Running Object Table).
    • if the Excel process hasn't been registered on the ROT (if it was just opened), you will get a Com Error.
    • you will get an error if the worksheet is being edited

    #IfWinActive, ahk_class XLMAIN

    F1::

    oExcel := Excel_Get(), oSheet := oExcel.ActiveWorkbook.ActiveSheet

    oSheet.Columns("A").ColumnWidth := 4, oSheet.Columns("B").ColumnWidth := 16

    oSheet.Columns("C").ColumnWidth := 10, oSheet.Columns("D").ColumnWidth := 10

    oSheet.Columns("E").ColumnWidth := 40, oSheet.Columns("F").ColumnWidth := 60

    oSheet.Cells.Select



    oSheet.Sort.SortFields.Clear

    oSheet.Sort.SortFields.Add(oSheet.Range("F:F"),0,1,ComObjMissing(),0)

    oSheet.Sort.SetRange(oSheet.Range("A:M"))

    oSheet.Sort.Header := 1, oSheet.Sort.MatchCase := 0

    oSheet.Sort.Orientation := 1, oSheet.Sort.SortMethod := 1

    oSheet.Sort.Apply

    return

    #IfWinActive


    에러 문구:
    Call to nonexistent function.
    Specifically: Excel_Get(), oSheet := oExcel.ActiveWorkbook.ActiveSheet

    • 남성 2018.12.07 15:39 신고

      아래와 같이하면 복사가 될 겁니다.

      xl2:= ComObjActive("Excel.application")
      xl2.ActiveSheet.Range("A1").copy

  3. 김민혁 2018.12.07 10:56

    참고한 사이트는 해당사이트 입니다
    https://autohotkey.com/board/topic/77840-how-to-pass-com-object-pointer-to-a-script/#entry495039

+ Recent posts