실행 코드
sdemon -o status -i 1234 -s 12.34.56.78
위와 같은 커맨드를 실행하기 위한 코드를 작성한다.
option := "%ComSpec% /c "
command = %option% sdemon -o status -i 1234 -s 12.34.56.78
objShell := ComObjCreate("WScript.Shell")
objExec := objShell.Exec(command)
위와 같은 코드로 해당 명령을 실행할 수 있다.
ComSpec
C:\Users>set comspec ComSpec=C:\Windows\system32\cmd.exe
커맨트 창에서 위와 같이 실행하면 %COMSPEC%의 경로를 확인할 수 있다.
ComSpec 옵션
http://www.robvanderwoude.com/command.php 에서 확인 가능하다.
- /c : 실행 후 창을 닫는다.
- /k : 실행 후 창을 유지한다.
/c 옵션을 주어도 반복 실행시에는 커맨드 창이 계속해서 생성되었다가 사라지는 현상이 발생한다.
이를 방지하기 위하여 아래 코드를 실행한다.
;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")
텍스트 파일 읽기
IP와 PORT값을 텍스트 파일로 읽어보자.
텍스트 파일은 CSV 형식으로 아이피,포트,설명 형식으로 생성하였다.
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
}
위의 코드를 실행하면 각각의 정보는 변수 ip, port, desc 에 담겨진다. 이를 활용하여 커맨드를 생성하면 된다.
Cmd 실행 결과 읽기
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
}
위의 코드를 실행하면 커맨드 실행 결과를 strStdOut 변수에 모두 담을 수 있다.
정규 표현식 읽기
strStdOut에 담겨진 텍스트 중에서 원하는 값을 찾는다.
FoundPos := RegExMatch(strStdOut, "Active Server Processes:\s+(?P<Process>\d+)", varRegExResult)
if (FoundPos != 0){
MsgBox %varRegExResultProcess%
}
여기서 유의해야 할 것은 변수명이다.
코드 RegExMatch(A,B(그룹명C),D); 일 경우에 아래와 같다.
A:문자열이 담겨진 변수 B:찾을 정규표현식 (안에 그룹명으로 C를 사용) D:받을 변수명
위와 같이 명령어를 실해하면 결과 변수명으로 DC 를 얻게 된다.
엑셀 파일 저장
파일 열기
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)
파일 읽기, 쓰기
colIdx := Xl.Range("A" . 1).Value ; Starting Column Position
colIdx := Floor(colIdx) + 1 ; make float to int
Xl.Range("A" . 1).Value := colIdx
엑셀의 컬럼, 로우 값의 Value를 통하여 해당 데이터를 읽거나 쓸 수 있다.
엑셀에서 데이터 입력시에, 컬럼을 숫자로 사용하지 않고 알파벳으로 사용한다. 따라서 순차적으로 증가하는 코드를 작성할 경우에 알파벳으로 변환해 주는 코드가 필요하다.
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]
}
}
위의 함수를 사용하여 인덱스를 엑셀에서 사용하는 알파벳으로 변경한다.
여기에서 사용하지 않지만 참고로 반대로 변환하는 경우에는 아래 함수를 사용한다.
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
}
EXE 파일 생성
Ahk2Exe 를 실행하여 exe로 변경한다.
'Programming > AutoHotKey' 카테고리의 다른 글
| [AHK] 두벌식보다 편한 것은...? (6) | 2015.01.08 |
|---|---|
| [AHK] AutoHotKey 환경변수 (0) | 2014.10.26 |
| [AHK] 괄호 자동 완성 (0) | 2013.11.11 |
| [AHK] AutohotKey 0x01 미니키보드 만들기 (0) | 2013.09.28 |
| [AHK] AutoHotKey 0x00 처음 접하다 (0) | 2013.09.14 |
run_cmd_and_save_excel.ahk
댓글