문서 보기역링크PDF로 내보내기맨 위로 이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요. # [AuthoHotKey] cmd 실행 {{tag>autohotkey text read save excel}} ## 실행 코드 <code> sdemon -o status -i 1234 -s 12.34.56.78 </code> 위와 같은 커맨드를 실행하기 위한 코드를 작성한다. <code> option := "%ComSpec% /c " command = %option% sdemon -o status -i 1234 -s 12.34.56.78 objShell := ComObjCreate("WScript.Shell") objExec := objShell.Exec(command) </code> 위와 같은 코드로 해당 명령을 실행할 수 있다. ## ComSpec <code> C:\Users>set comspec ComSpec=C:\Windows\system32\cmd.exe </code> 커맨트 창에서 위와 같이 실행하면 %COMSPEC%의 경로를 확인할 수 있다. ### ComSpec 옵션 http://www.robvanderwoude.com/command.php 에서 확인 가능하다. * /c : 실행 후 창을 닫는다. * /k : 실행 후 창을 유지한다. /c 옵션을 주어도 반복 실행시에는 커맨드 창이 계속해서 생성되었다가 사라지는 현상이 발생한다. 이를 방지하기 위하여 아래 코드를 실행한다. <code> ;If you add this to the auto-execute section (top) of your script, the window will flash only once instead of every time you call GetDFHack(): DllCall("AllocConsole") WinHide % "ahk_id " DllCall("GetConsoleWindow", "ptr") </code> # 텍스트 파일 읽기 IP와 PORT값을 텍스트 파일로 읽어보자. 텍스트 파일은 CSV 형식으로 `아이피,포트,설명` 형식으로 생성하였다. <code> textFile := % A_ScriptDir . "\sdelist.txt" ; 텍스트 파일 경로 Loop, read, %textFile% ; 루프로 파일 읽기 { Loop, parse, A_LoopReadLine, `, ; , (컴마)로 구분해서 읽어오기 { if (A_Index = 1) { ; csv로 정의한 순서대로 읽어오기 ip = %A_LoopField% ; 1. IP } else if (A_Index = 2) { ; 2. PORT port = %A_LoopField% } else if (A_Index = 3) { ; 3. description desc = %A_LoopField% } } ; run command execution } </code> 위의 코드를 실행하면 각각의 정보는 변수 ip, port, desc 에 담겨진다. 이를 활용하여 커맨드를 생성하면 된다. # Cmd 실행 결과 읽기 <code> option := "%ComSpec% /c " command = %option% sdemon -o status -i %port% -s %ip% objShell := ComObjCreate("WScript.Shell") objExec := objShell.Exec(command) strStdOut := "" ; 하나의 변수에 모두 담는다. while, !objExec.StdOut.AtEndOfStream { strStdOut .= objExec.StdOut.ReadLine() Sleep, 100 } </code> 위의 코드를 실행하면 커맨드 실행 결과를 strStdOut 변수에 모두 담을 수 있다. # 정규 표현식 읽기 strStdOut에 담겨진 텍스트 중에서 원하는 값을 찾는다. <code> FoundPos := RegExMatch(strStdOut, "Active Server Processes:\s+(?P<Process>\d+)", varRegExResult) if (FoundPos != 0){ MsgBox %varRegExResultProcess% } </code> 여기서 유의해야 할 것은 변수명이다. 코드 RegExMatch(A,B(그룹명C),D); 일 경우에 아래와 같다. A:문자열이 담겨진 변수 B:찾을 정규표현식 (안에 그룹명으로 C를 사용) D:받을 변수명 위와 같이 명령어를 실해하면 결과 변수명으로 `DC` 를 얻게 된다. # 엑셀 파일 저장 ## 파일 열기 <code> excelFile := % A_ScriptDir . "\result.xlsx" ; 엑셀 파일 경로 if (FileExist(excelFile) != "A"){ ; 파일 상태 확인 MsgBox, "Not Accessible Excel result File" return } Xl := ComObjCreate("Excel.Application") ;create handle excel := Xl.Workbooks.Open(excelFile) </code> ## 파일 읽기, 쓰기 <code> colIdx := Xl.Range("A" . 1).Value ; Starting Column Position colIdx := Floor(colIdx) + 1 ; make float to int Xl.Range("A" . 1).Value := colIdx </code> 엑셀의 컬럼, 로우 값의 Value를 통하여 해당 데이터를 읽거나 쓸 수 있다. 엑셀에서 데이터 입력시에, 컬럼을 숫자로 사용하지 않고 알파벳으로 사용한다. 따라서 순차적으로 증가하는 코드를 작성할 경우에 알파벳으로 변환해 주는 코드가 필요하다. <code> ExcelColumnName(colIdx) { chars := ["A", "B", "C", "D", "E", "F" , "G", "H", "I", "J", "K" ,"L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] quotien := colIdx // 26 charIdx := mod(colIdx,26) if (quotien > 0){ return ExcelColumnName(quotien) . chars[charIdx] } else { return % chars[charIdx] } } </code> 위의 함수를 사용하여 인덱스를 엑셀에서 사용하는 알파벳으로 변경한다. 여기에서 사용하지 않지만 참고로 반대로 변환하는 경우에는 아래 함수를 사용한다. <code> ExcelColumnNumber(colName) { total := 0 number := 0 pow := 1 length := StrLen(colName) Loop, %length% { char := SubStr(colName, length - A_Index + 1, 1) number := % (asc(char) - asc("A") + 1) * pow total += number pow *= 26 } return total } </code> # EXE 파일 생성 {{ :blog:applications:autohotkey:2014-07-08_09_57_15.png?300 |}} Ahk2Exe 를 실행하여 exe로 변경한다. open/autohotkey-cmd-실행.txt 마지막으로 수정됨: 2020/06/02 09:25저자 127.0.0.1