Windows Batch 파일(.BAT)에서 IF 문에서 수식 사용

IF 문에서 수식을 사용하고 싶을 때, 예를 들면, 에러 체크를 위해 루프를 도는 개수등을 카운트하고 싶다면 SET 에서 /A 옵션을 사용하고 IF에서 비교 연산자를 사용하면 된다. IF 문의 비교 연산자는 다음과 같다

EQU – 같음
NEQ – 같지 않음
LSS – 보다 작은
LEQ – 작거나 같음
GTR – 보다 큰
GEQ – 크거나 같음

다음은 start 로 3가지 일을 동시에 처리한 후 goto와 label을 이용, cygwin의 delay로 일정 시간 체크한 후 그 후 에러로 처리하는 bat 파일의 예다.

@echo off
SET /A LOOP_COUNT=1
SET /A LOOP_MAX_COUNT=5
SET CYGWIN_DELAY=[Cygwin 경로]\delay.exe
SET DELAY_TIME=5m

rem WORK1, 2, 3를 동시에 돌린다. 다음 작업에 dependency 가 있는 작업에
rem start의 /W 옵션을 주어 기다리도록 한다.

start WORK1.bat
start WORK2.bat
start /W WORK3.bat

goto CHECK

:DELAY
rem if LOOP_COUNT >= LOOP_MAX_COUNT
IF %LOOP_COUNT% GEQ %LOOP_MAX_COUNT% (

echo ERROR!

exit 1

)
rem Delay 한다.
%CYGWIN_DELAY% %DELAY_TIME%

rem LOOP_COUNT += 1
SET /A LOOP_COUNT+=1

:CHECK
echo Checking…
IF [WORK1 실패조건] (


echo Work 1 is Failed!

goto DELAY

)
echo Work1 is success!
IF [WORK2 실패조건] (

echo Work 2 is Failed!

goto DELAY

)
echo Work2 is success!
IF [WORK3 실패조건] (

echo Work 3 is Failed!

goto DELAY

)
echo Work3 is success!

call WORK4.bat

Windows Shell Extension 개발 참고자료

MSDN : Creating Shell Extension Handlers

The Complete Idiot’s Guide to Writing Shell Extensions
 Part 1
 Part 2
 Part 3
 Part 4
 Part 5
 Part 6
 Part 7
 Part 8
 Part 9

Shell Extension Context Menu Sample
Registry에 등록하는 건 Post-Build Step 에서 Regsvr32를 이용해서 등록한다. 커맨드는 다음과 같다.

regsvr32.exe /s /c $(OUTDIR)\CtxMenu.dll

Registry에 등록을 해제하는 건 다음과 같은 커맨드로 가능하다.

regsvr32.exe /s /u $(OUTDIR)\CtxMenu.dll

Registry 등록 관련 절차는 ShellExtReg.cpp 내의 RegisterFileMenu() 와 UnregisterFileMenu() 내부를 참고하면 좋다.

Unicode string를 MBCS string으로 바꾸는 방법

1. WideCharToMultiByte() API를 호출하는 방법
2. CRT 함수 wcstombs() 를 호출하는 방법
3. CString 생성자나 assign을 통한 방법(MFC만 가능)
4. ATL string 변환 매크로를 이용하는 방법

WideCharToMultiByte

// Assuming we already have a Unicode string wszSomeString…
char szANSIString [MAX_PATH];

    WideCharToMultiByte ( CP_ACP,                // ANSI code page
                          WC_COMPOSITECHECK,     // Check for accented characters
                          wszSomeString,         // Source Unicode string
                          -1,                    // -1 means string is zero-terminated
                          szANSIString,          // Destination char string
                          sizeof(szANSIString),  // Size of buffer
                          NULL,                  // No default character
                          NULL );                // Don’t care about this flag

wcstombs

    wcstombs ( szANSIString, wszSomeString, sizeof(szANSIString) );

CString

// Assuming we already have wszSomeString…

CString str1 ( wszSomeString );    // Convert with a constructor.
CString str2;

    str2 = wszSomeString;          // Convert with an assignment operator.

ATL Macro

#include <atlconv.h>

// Again assuming we have wszSomeString…

{
char szANSIString [MAX_PATH];
USES_CONVERSION;  // Declare local variable used by the macros.

    lstrcpy ( szANSIString, OLE2A(wszSomeString) );
}

참고 : Introduction
to COM – What It Is and How to Use It.
by Michael Dunn

원격 데스크톱 연결 – XP3 에서 윈도우즈 키 안먹힐 때..

윈도우즈 XP SP3로 오면서 Remote Desktop Connection tool(RDP Client)인 mstsc가 Ver. 6.0.6001로 업그레이드되면서 몇 가지 변경이 있다.

1. /console 옵션 대신 /admin 옵션을 사용한다는 것
2. 원격 접속된 컴퓨터에서의 Windows-key나 Alt-key 조합이 먹지 않는 것

1 번은 그렇다쳐도 2 번은 정말 불편하다-_-

업그레이드된 버전으로 어떻게 안되나 많이 시도해보았지만 결론은 안되는 듯 하다.
이를 위해 기존 5.2 클라이언트를 사용하기로 결정하고 검색해보았더니 프리웨어로 TSplus Portable RDP 5.2 client가 있다. 이를 이용해서 사용하면 된다.

Windows Batch 파일(.BAT)에서 Exit code 조정

Windows의 Batch 파일에서 Exit code를 원하는 값으로 설정하고 종료하고 싶다면..

exit /B <exitCode>

Batch 파일 안에서 Exit code 는 ERRORLEVEL 환경변수(%ERRORLEVEL%) 로 접근할 수 있다.

Perl을 이용한 파일내의 문자열 치환

perl을 이용해서 파일 내부의 특정 문자열을 한번에 바꿀 수 있다.

perl -pi -e ‘s/<원본문자열>/<바꿀문자열>/g’ <FILE명>

<원본문자열> 부분은 정규식을 사용한다.

작은 따옴표와 큰 따옴표 사용에 관한 차이를 알고 싶다면 http://kldp.org/node/98639#comment-460800 를 참고!

NMake – Makefile 내부의 인라인 파일

NMake를 사용할 때 Makefile 내부에 파일을 내장해서(인라인 파일) 사용할 수 있다.
형식은 다음과 같다.

<<[Filename]
파일 내용
<<[KEEP or NOKEEP]

위와 같은 내용을 Makefile 내부에 써놓으면 << 들 사이의 내용이 파일로 저장되어 사용가능하게 된다. Filename 을 적으면 해당파일명으로 파일이 생성되고 적지 않으면 임의의 이름으로 임시파일이 생성된다. 또한, Make 세션 사용 후에 파일을 남겨두고 싶다면 KEEP을, 아니라면 NOKEEP 또는 아무것도 쓰지 않으면 된다.

파일 내용 안에는 $(변수) 등을 써두면 써둔 “$(변수)”가 아닌 변수로 치환되는 내용이 그대로 들어가므로 편리하다.

참고 : http://msdn.microsoft.com/ko-kr/library/seaaew50(VS.80).aspx

Python import 경로추가, 주석, 함수선언, Dictionary, List, Tuple

파이썬 문서고

Dive into Python

wxPython Tutorial(http://zetcode.com/wxpython/)
구글의 파이썬 튜토리얼 번역

import 경로 추가

import sys;
sys.path.append(‘/mypath’)

주석(문서화에 사용)

“”” 여

줄 주석 “””

함수 선언

def functionname(parameter):
    body

Dictionary : {, } 사용, 순서라는 개념 없음

dic = { <key1>:<value1>, <key2>:<value2> }

Dictionary Data 제거

del dic[<key>]

Dictionary의 모든 element 삭제

dic.clear()

List : [, ] 사용, 인덱스 사용. Element가 중복 존재 가능

li = [ <element1>, <element2> ]

음수 인덱스 사용가능. -1이 가장 끝

li[-1]

List slice

li[1:3] 1, 2번째 인덱스의 원소의 리스트를 새로 생성
li[:] 리스트의 복사본 생성

List 원소 추가

li.append(<element>)
li.insert(<index>, <element>)
li.extend(<list>)

List 검색
list 내의 가장 첫번째 원소의 index

li.index(<element>)

list 에 있는지 검사

<element> in li

List 에서 원소 제거

li.remove(<element>)

가장 마지막 원소 제거하면서 리턴

li.pop()

+ 연산자 : 새로운 리스트를 리턴(extend는 변경)

li = <list1> + <list2>

+= 연산자는 extend와 동일

li += <list>

* 는 반복자로 작동

li = <list> * 3

Tuple : (, ) 사용. 변경 불가능, append, extend, remove, pop, index는 없음, in 으로 검사는 가능, 리스트보다 빠름

tup = ( <element1>, <element2> )

IP 변경 유틸리티 – Shock IP Changer

IP 변경이 잦을 때 필요한 유틸리티
프리웨어로 개인/기업 라이센스 관계없이 사용가능하다.
제작사 홈페이지에 가면 이외에도 여러 프리웨어들을 볼 수 있다.
종류가 대단히 많아보인다.
개인제작자라면 정말 대단하다.

참고 : 가끔은 아주 유용한 IP 변경 관리 유틸리티 Shock IP Changer by 돌이아빠