[윈도우] 명령행 실행에 대하여 이상하게 처리하는 문제에 대한 고찰 Develop Tip

윈도우에서 CMD.EXE 에서 특정 CLI를 실행하는 것과 같이 작업을 하다가 알게 된
이상한 점에 해하여 같이 공유하고자 합니다.

예를 들어 다음과 같이 폴더와 폴더를 복사하는 프로그램이 있다고 가정해 봅니다.

C:\> dircopy src target

위의 프로그램에서 src와 target은 각각 윈도우의 폴더가 올 수 있습니다.

예를 들어,

C:> dircopy C:\tmp\1 C:\tmp\2

라고 하면, C:\tmp\1 의 폴더가 모두 C:\tmp\2 에 복사되는 것 말입니다.

어떤 사용자가 그런데 src에 \로 끝내야 할 지 몰라,

C:> dircopy C:\tmp\1\ C:\tmp\2

라고 한다고 해도 동일하게 동작합니다.

dircopy 입장에서는, 첫번째 패러미터로 "C:\tmp\1\" 가 오고 두번째 패러미터로 "C:\tmp\2" 가 
오는데 일반적으로 "C:\tmp\1\\*" 라고 호출을 해도 이상없이 동작하기 때문이지요.

문제는 위의 명령에서 만약 폴더명에 공백이 있거나 해서 따옴표를 넣을 때 발생합니다.

C:> dircopy "C:\tmp\1\" "C:\tmp\2"

위와 같이 따옴표를 주어도 하등 문제없이 동작을 해야 할 것 같은데,
실제로 실행시켜 보면 이상한 오류가 발생합니다.
그래서 해당 프로그램에서 패러미터가 어떻게 들어오나 확인을 하였더니,

두번째 패러미터는 없고 첫번째 패러미터가, 

C:\tmp\1" "C:\tmp\2

라고 프로그램에 넘어가는 것입니다.

음... 왜 이런 현상이 발생하였을까 생각을 해 보니,
CMD.EXE 에서 패러미터를 파싱할 때 발생하는 문제 아닌가 싶습니다.

파싱할 때 " ... " 라는 리터럴에서 "를 포함하기 위해서, \ 이스케잎 시퀀스를

" ... \" ... " 라고 포함하는 것을 우선 처리한다고 가정하면 위와 같은 문제가 발생합니다.
위의 문제를 다음과 같이 하면 또 해결됩니다.

C:> dircopy "C:\tmp\1\\" "C:\tmp\2"

\" 대신 \\" 라고 하면 앞에 \\ 가 \ 로 되어 정상적으로 "가 닫히기 때문이지요.

보통 C#에서 다른 프로세스를 호출할 때,
Process의 StartInfo에 arguments 에 위와 같이 패러미터를 기술하는데,
동일한 문제가 발생합니다.

아마도 이는 동일한 파싱 라이브러리를 이용하기 때문이 아닌가 싶네요.

따라서 위와 같이 패러미터에 항상 따옴표를 붙이는데 \로 끝나는 경우에는 \를 하나 붙여주어야
정상으로 동작하는 프로그램이 되는 것이네요.


어느 분께는 도움이 되셨기를 .. 


핑백

덧글

댓글 입력 영역

구글애드텍스트