[AuthoHotKey] cmd 실행

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)

위와 같은 코드로 해당 명령을 실행할 수 있다.

C:\Users>set comspec
ComSpec=C:\Windows\system32\cmd.exe

커맨트 창에서 위와 같이 실행하면 %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로 변경한다.


  • open/autohotkey-cmd-실행.txt
  • 마지막으로 수정됨: 2020/06/02 09:25
  • 저자 127.0.0.1