예상치 않은 USB 메모리 오류 해결 방법으로 CMD 창을 이용한 diskpart 윈도우 명령어를 통해 쉽게 해결 할 수 있습니다.

쿨펀치의 포스팅을 보시고 하나씩 따라 하시면 됩니다.

 

 

윈도우 시작 버튼 누른 후

" 실행 " 메뉴 또는 위 이미지처럼 " 검색창 " 에

1. CMD 입력.

2. 검색된 CMD 클릭.

 

 

CMD 프롬프트창이 열렸습니다.

diskpart 입력 후, 엔터키 입력.

 

 

위 순서대로 명령어 입력을 해주셔야 합니다.

중간 에 선택 적용해야 되는 부분이 있습니다.

꼭 설명을 잘 이해하신 후 따라 하셔야 USB 메모리 초기화에 큰 문제가 없습니다.

 

diskpart 명령어 설명

- list disk : 컴퓨터에 연결된 물리적인 하드디스크 & 메모리 디스크 등을 보여 줍니다.

- select disk 8 (선택 하고자 하는 디스크 숫자) : 물리적 하드디스크 & 메모리 디스크등 포맷 하고자 하는 디스크 선택.

- clean : 선택된 디스크 초기화

- create partition primary : 선택된 디스크의 전체공간을 주 파티션으로 만듭니다.

- format fs=ntfs quick : 선택된 디스크 ntfs로 빠른 포맷 합니다.

- format fs=fat32 quick : 선택된 디스크 fat32로 빠른 포맷 합니다.

- exit : 해당 명령어 밖으로 나가기 & 프롬프트 창 닫기.

 

USB 메모리 초기화 명령어 입력 순서

1. list disk

2. select disk 8 (초기화 하고자 하는 디스크 숫자를 선택 하시면 됩니다. 저는 디스크 8을 포맷하기 위해 8 선택)

3. clean

4. create partition primary

5. format fs=ntfs quick  (포맷 형식에 따라 NTFS 또는 FAT32 중 선택 포맷 하시면 됩니다.)

6. exit

7. exit

위 1. ~ 7. 순위로 명령을 입력 하시면 됩니다.

 

위 USB 메모리 초기화 명령어 입력 순서대로 따라 하셨다면.

USB 메모리 초기화 완료입니다.

 

참고!!

USB 메모리 초기화 이후 포맷 방식 변경하고자 할 때.

방법1

USB 메모리 초기화 방법 다시 실행 후 포맷 방식 변경

 

방법2

USB 메모리 초기화 이후 드라이브 속성에서 포맷 설정 변경하기

USB 메모리 초기화 이후 포맷 형식을 바꾸고 싶다면,

CMD 명령 프롬프트 창을 이용 하지 않고도 윈도우 탐색기에서 포맷 하고 하는 드라이브 마우스 우클릭 하시면 " 포맷 " 있습니다.

포맷 창이 열린 후 파일 시스템을 선택 사용자가 원하는 포맷 형식을 선택 포맷을 하시면 됩니다.

 

아참 이 방법은 USB 메모리 초기화 완료후 포맷 방식 변경 하는 법입니다.

USB 메모리 초기화 방법이 아님을 참고해 주세요. 

 

쿨펀치와 함께 USB 메모리 초기화 방법에 대해 알아봤습니다.

즐거운 컴퓨터 생활 할 수 있도록 최선을 다해 포스팅 하겠습니다.


 


출처 http://coolpunch.tistory.com/677

 


Posted by 장안동베짱e :

NT6 계열 운영체제에서 아이콘에 방패가 그려져 있고 실행시킬 때 다음의 경고 메시지가 뜬다. 
"게시자를 알 수 없는 다음 프로그램이 이 컴퓨터를 변경 할 수 있도록 허용하시겠습니까?" 
이 때 이 방법을 활용해보자. 여기서는 사용자 계정 컨트롤을 활성화시킨 다음에도 UAC를 우회할 수 있는 방법을 설명한다. 

1. 시작 메뉴에서 작업스케줄러를 입력해서 실행시킨다. 

2. 3개로 분활 된 화면 중 오른쪽 작업 창에서 [작업 만들기] 클릭 



3. [이름] 항목에 단축실행할 이름을 입력한다. 그리고 [가장 높은 수준의 권한으로 실행]을 체크한다. 



4. [동작]을 누른다.그리고 [새로 만들기]를 누른다. 


5. 프로그램의 경로를 입력하거나 [찾아보기]를 누른 후 실행 할 프로그램을 선택한다. 



이제 방금 추가한 프로그램이 추가된 것을 볼 수 있다. 



6. 노트북인 경우 [조건]에서 [전원] 부분의 체크를 [컴퓨터의 AC 전원이 켜져 있는 경우에만 작업 시작] 를 지워서 배터리 상태에서도 동작하게 한다. 



7. [설정] 에서 [요청 시 작업이 실행되도록 허용]과 [요청할 때 실행 중인 작업이 끝나지 않으면 강제로 작업 중지] 두 개만 체크되도록 한다. 



8. 이제 다시 3개의 분할 된 창영역 중에서 제일 왼쪽 [작업 스케줄러 라이브러리]를 선택한다. 
방금 만든 권한 상승된 작업이 추가되었다. 




9. 바탕화면에 바로가기를 만든다. 바탕화면 오른쪽 클릭 - [새로 만들기] - [바로 가기] 

10. [항목 위치 입력] 부분에 C:\Windows\System32\schtasks.exe /run /tn "방금만든 작업이름"과 같은 형식으로 입력한다. 

이제 작업을 실행하면 UAC 내용의 확인을 묻지 않고 작은 커맨드 창이 떴다가 바로 프로그램이 실행되는 모습을 볼 수 있다. 

바로 가기의 [속성]에서 [바로가기] - [아이콘 변경] 을 통해 해당 실행 프로그램의 아이콘으로 변경시킬 수 있다. 



 


출처 http://finder-textcube.blogspot.kr/2011/08/uac.html
원본 http://www.vistax64.com/tutorials/162976-bypass-uac.html
 

 


Posted by 장안동베짱e :
질문은 이런 내용 이었다.

현재 메모리 누수 현상이 있어
jdbc connection 관련해서 확인하고 있는데요

보통 PreparedStatement, ResultSet 사용 후 finally 절에서 close 하자나요
근데 Vector 라든지 StringBuffer 도 사용 후 null 처리를 하고 종료를 해야하는지 잘 모르겠네요

소스에서 null 된것도 있고 안된것도 있고;; 헷갈리네요
구글링 해도 잘 안나와 있고 ㅠㅜ
...

이 질문에 대한 내 생각은 이렇다...

=================================================================

*제 답변은 일반적으로 많이 사용하는 썬의 (지금은 오라클이지만.. ㅜ_ㅜ) JVM 구현을 기준으로 합니다.

의견이 상당히 많이 달려있군요. 

메모리와 관련하여

1. 객체를 사용하고 나서 null 할당하는건 코드만 더럽히는 짓이다 vs 꼭꼭 null 처리해주는 좋은습관!
2. null 을 할당하는것은 별 의미없다 vs 이건 정말 중요하다
3. null 을 할당한다면 언제 할당해야 하느냐?



이런것들은 자바를 사용하는 개발자들 사이에서 오랫동안 논란이 되어왔고 아직도 논란이 되고 있는 부분이지요. 사실상 이 논란은 자바라는 언어에서 프로그래머가 직접 메모리를 할당/관리 하지 않기때문에 발생하는 것입니다. 하지만 GC 의 원리를 이해하게되면 null 할당이 편집증걸린 프로그래머나 할만한 일은 아니라는것을 알게됩니다. 그리고, 자바라는 언어가 이런 부분들을 해소하기 위해 어떤 노력을 했는지도 알수 있지요. (뒤에 null 할당이 아닌 다른 방법으로 동일한 효과를 얻는 예제를 소개 하겠습니다.) 

위의 3가지 논란에 대해 정리하기에 앞서 한가지 모두가 인정할만한 부분을 짚고 넘어가겠습니다. 

작은 프로그램(혹은 메서드)에서는 null 할당은 큰 의미가 없습니다. 여기서 작은 프로그램이란 
  • 프로그램(혹은 메서드) 자체의 동작시간이 짧고
  • 객체의 생성이 빈번하지 않으며
  • 적은 메모리를 사용하는 
  • 메모리 누수가 문제되지 않는
  • 실행시 지정한(혹은 기본값) 힙사이즈를 채 반도 사용하지 않는
프로그램(메서드)으로 정의해 보겠습니다. (좀더 구체적으로 정의할 방법도 있겠습니다만 당장 떠오르는게 저것밖에 없네요. ^-^;;) 사실 공부하려고 짜보는 프로그램이 아닌 어느정도 규모있는 프로그램이라면 대부분 위의 네가지에 정반대되는 경우일 겁니다.  제가 계속 프로그램이라는 단어에 괄호치고 메서드라고 넣는 이유는 프로그램 전체가 위의 항목에 해당 될수도 있지만 어느 클래스의 특정 메서드가 위의 항목에 해당되는 경우도 있기 때문입니다. 이를 테면 작은 프로그램인데 몇개의 클래스에 정의된 특정 메서드들이 프로그램의 실행시간의 많은 부분을 차지한다던가 그 메서드에서만 메모리를 많이 사용한다던가 라는 상황도 있기 때문입니다. 

(프로그램(메서드)의 규모는 개발자마다 체감되는게 다르기 때문에 작다 크다 정의내리면 논란이 되는 경우가 많은데 일단 얘기를 이어나가야 하니 넘어갑시다.)

맨위에서 언급한 논란의 각각에 작은 프로그램(메서드)의 정의를 반대로 적용해 보시면 도움이 될겁니다. 정의를 반대로 적용봤을때 해당한다면 고민하지 마시고 아래의 방법을 추천드립니다.

지금 작성하고 있는 코드가 큰 프로그램(메서드)의 일부라면 항상 가능한한 모든 객체의 사용후 null 을 할당해 주어야 하며, 이것은 정말 중요한 부분입니다.

왜 위와 같이 해야하는지 몇가지 예제을 통해 살펴보도록 하겠습니다. 직접 붙여넣고 실행 해보시기 바랍니다. (실행시 VM 옵션으로 -verbose:gc 를 추가하셔서 실제 GC 가 일어나는 것을 확인해 보세요.)

첫번째 예제 : null 을 안주면 어떻게 되나?

public class GCTest {
private final static int ALLOC_SIZE = (int) (Runtime.getRuntime().maxMemory() * 0.60);

public void allocate() {

System.out.println("Before first allocation");
byte[] b = new byte[ALLOC_SIZE];
System.out.println("After first allocation");

System.out.println("Before second allocation");
byte[] b2 = new byte[ALLOC_SIZE];
System.out.println("After second allocation");

}

public static void main(String[] args) {
new GCTest().allocate();
}
}

먼저 예제를 설명 드리자면 가용한 메모리의 60% 를 allocate 라는 메서드의 첫번째 지역 변수인 b 에서 할당을 합니다. 그리고 이후에는 전혀 사용되지 않고 있지요. 그리고 나서 다시 두번째 지역변수인 b2 에서 또 60% 를 할당을 합니다. 

위의 예제의 결과는 아래 와 같습니다.

Before first allocation
After first allocation
Before second allocation
[GC 555205K->555136K(712576K), 0.0017096 secs]
[GC 555136K->555104K(712576K), 0.0045040 secs]
[Full GC 555104K->555088K(660160K), 0.0052565 secs]
[GC 555088K->555088K(712576K), 0.0071493 secs]
[Full GC 555088K->555066K(665280K), 0.0062704 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at GCTest.allocate(GCTest.java:12)
at GCTest.main(GCTest.java:18)

첫번째 할당은 정상적으로 이뤄졌지만 두번째 할당을 진행하려고 보니 메모리가 부족한 상황이라 마이너 GC 가 발생하고 연달아 Full GC 까지 이뤄 졌습니다. 하지만 메모리는 여전히 부족합니다. 왜냐면 메서드가 반환되기 이전에는 b 의 참조가 존재하므로 (설사 사용되지 않는다 하더라도) GC 대상에서 제외되었기 때문입니다. 누가봐도 당연히 OOM (Out of memory) 가 나는 상황입니다. 또한 누가봐도 b2 를 할당하는 시점에 GC 가 일어 난다고 예상이 됩니다. (메모리가 부족한 상황에서 GC 는 반드시 일어납니다.) 

이 예제는 조건을 극단적으로 단순화 해놨을 뿐이지 규모가 큰 프로그램(메서드) 에서는 언제든 발생할 수 있는 상황입니다. 예를 들어 여러 스레드가 동작하며 각각 어떤 메서드를 실행을 하는데 그 메서드가 이런 구조라면

메서드 호출 -> 객체 잔뜩 생성 -> 객체 마구 사용(이후에는 사용안함) -> 블럭되는 I/O 처리 -> 반환

메서드가 종료되기 전까지 참조를 물고있는 사용되지 않는 지역변수들이 점점 쌓여 갈겁니다. 결국 메모리가 부족해 GC 가 수행되더라도 GC 의 대상이 되어야할 객체들은 참조를 물고 있으니 OOM(버틸수가없다) 으로 직행하는 거지요.

두번째 예제 : null 을 주면 어떻게 되나?

public class GCTest2 {
private final static int ALLOC_SIZE = (int) (Runtime.getRuntime().maxMemory() * 0.60);

public void allocate() {

System.out.println("Before first allocation");
byte[] b = new byte[ALLOC_SIZE];
System.out.println("After first allocation");
b = null;
System.out.println("After assign null to b");
System.out.println("Before second allocation");
byte[] b2 = new byte[ALLOC_SIZE];
System.out.println("After second allocation");
}
public static void main(String[] args) {
new GCTest2().allocate();
}
}

첫번째 예제와 상황은 동일합니다. 하지만 b 를 다쓰고 나서 null 할당 해주었지요.
결과는 이렇습니다.

Before first allocation
After first allocation
After assign null to b
Before second allocation
[GC 555205K->555168K(712576K), 0.0019313 secs]
[GC 555168K->555104K(712576K), 0.0027482 secs]
[Full GC 555104K->208K(105344K), 0.0509913 secs]
After second allocation

예상하셨다시피 OOM 은 일어나지 않았습니다. 앞서 언급했던 

메서드 호출 -> 객체 잔뜩 생성 -> 객체 마구 사용(이후에는 사용안함) -> 블럭되는 I/O 처리 -> 반환

이런 구조의 메서드를 

메서드 호출 -> 객체 잔뜩 생성 -> 객체 마구 사용(이후에는 사용안함) -> 마구사용한 객체 가차없이 null 할당 -> 블럭되는 I/O 처리 -> 반환

이렇식으로 수정한 것과 동일합니다. OOM 으로 직행하려다가 현명한 개발자 덕분에 GC 가 보람있는 일을 했네요. 일례로 많은 사용자를 대상으로 하는 웹어플리케이션에는 아주 딱 들어맞는 상황입니다. 특히. 웹이라는 특성상 서비스의 유형에 따라 피크타임이 존재하기 때문에 더더욱 적합합니다. (개발자의 상황에 적합하지 못한 코드 덕분에 심심하면 죽어나간 서버가 한둘이 아닙니다.)

조건을 단순화한 예제이지만 대부분의 큰 프로그램의 어딘가에서 null 할당을 해줘야 하나 말아야 하나를 고민할때 생각해 볼만한 예제라고 생각이되는군요.

적다보니 내용이 너무 길어 지는 감이 있어 앞에서 얘기한 null 할당 이외의 방법을 소개하고 끝내도록 하겠습니다. 

자바가 처음 나온후 컴퓨터 분야에서는 꽤 오랜 시간이 흘렀습니다.  VM 이 알아서 메모리를 관리해 준다는 장점은 사용하다보니 다른 문제들을 야기하게 되었습니다. 바로 "우린 좀더 GC 와 얘기하고싶다" 라는 건데요.

null 할당은 GC 가 일어나기만 하면 바로 회수해 가버리고 이후에 해당 객체를 더이상 사용할 수 없지만.

1. GC 를 한번 해보고, 메모리가 충분하다면 계속 참조하고 싶다
2. GC 가 일어나기 전까지만 계속 참조하고 싶다.
3. finalize 이후에 뭔가 더 처리 하고 싶다.

라는 요구사항들이 여기저기서 터져나오기 시작한거죠. 결국 1.2 버전에서 새로운 클래스들이 소개되기 에 이르렀는데 그게 바로 

java.lang.ref 

패키지 입니다. 현재 많은 오픈소스 캐싱 라이브러리 들이 이 패키지를 잘 활용한 예제이지요.  여기에는 딱 5개의 클래스가 존재 합니다.

Reference, PhantomReference, SoftReference, WeakReference, ReferenceQueue

입니다. 여기서 주역들은 

1. GC 를 한번 해보고, 메모리가 충분하다면 계속 참조하고 싶다 (SoftReference)
2. GC 가 일어나기 전까지만 계속 참조하고 싶다. (WeakReference)
3. finalize 이후에 뭔가 더 처리 하고 싶다. (PhantomReference)

이 3가지 클래스 입니다. 저는 WeakReference 와 SoftReference 를 소개 하겠습니다.

WeakReference 예제

import java.lang.ref.WeakReference;

public class GCTest3 {
private final static int ALLOC_SIZE = (int) (Runtime.getRuntime().maxMemory() * 0.60);
public void allocate() {
System.out.println("Before first allocation");
WeakReference<byte[]> b = new WeakReference<byte[]>(new byte[ALLOC_SIZE]);
System.out.println("After first allocation");

System.out.println("b is alive ? " + b.get());
System.out.println("Before second allocation");
byte[] b2 = new byte[ALLOC_SIZE];
System.out.println("After second allocation");
System.out.println("b is alive ? " + b.get());
}
public static void main(String[] args) {
new GCTest3().allocate();
}
}

수행 결과는 

Before first allocation
After first allocation
b is alive ? [B@64c3c749
Before second allocation
[GC 555205K->555168K(712576K), 0.0016671 secs]
[GC 555168K->555104K(712576K), 0.0015086 secs]
[Full GC 555104K->208K(105344K), 0.0562847 secs]
After second allocation
b is alive ? null

GC 한방에 날아가버렸네요.


SoftReference 예제


import java.lang.ref.SoftReference;

public class GCTest3 {
private final static int ALLOC_SIZE = (int) (Runtime.getRuntime().maxMemory() * 0.60);
public void allocate() {
System.out.println("Before first allocation");
SoftReference<byte[]> b = new SoftReference<byte[]>(new byte[ALLOC_SIZE]);
System.out.println("After first allocation");

System.out.println("b is alive ? " + b.get());
System.out.println("Before second allocation");
byte[] b2 = new byte[ALLOC_SIZE];
System.out.println("After second allocation");
System.out.println("b is alive ? " + b.get());
}
public static void main(String[] args) {
new GCTest3().allocate();
}
}


WeakReference 의 예제에서 SoftReference 로 클래스만 바뀌었습니다.

결과를 볼까요?

Before first allocation
After first allocation
b is alive ? [B@7150bd4d
Before second allocation
[GC 555205K->555136K(712576K), 0.0016918 secs]
[GC 555136K->555104K(712576K), 0.0014965 secs]
[Full GC 555104K->555088K(660160K), 0.0045636 secs]
[GC 555088K->555088K(712576K), 0.0068316 secs]
[Full GC 555088K->186K(110208K), 0.0575150 secs]
After second allocation
b is alive ? null

한번 해보고 버틸수가 없다! 이러니까. 결국 이녀석도 날아가 버렸네요.


오늘 제가 여지껏 지식인에서 했던 답변중 제일 긴 답변인것 같습니다.

꼭 도움이 됐길 바랍니다. 즐겁게 프로그래밍 하시구요~ 그럼 이만! 




원본 http://lemonfish.egloos.com/5380639




Posted by 장안동베짱e :
  • 동시 실행 문제
단순히 위와 같이 파일 경로만 정해주면,
파일이 실행된 후에 그 파일이 종료되고 커맨드가 실행창으로 넘어올 때까지 대기하게 된다.
동시 실행을 위해서는 배치 명령어 start 를 사용하면 되겠다.
start 명령어의 /d 옵션은 파일의 시작 위치를 나타내며, /b 는 새로 창을 띄우지 않겠다는 옵션이다.
(cmd 에서 start /? 으로 확인해보자)
start /d "C:\Program Files\Mozilla Firefox\" /b firefox.exe
start /d "C:\Program Files\Internet Explorer\" /b iexplore.exe

  • 배치 파일의 실행
다른 배치 파일은 call 명령어를 이용해 실행시켜야 한다.
call "C:\QuickStart\setNetworkDrive.bat"


배치 파일(.bat)로 테스트 스크립트를 작성하다보면 sleep 해야 할 경우가 생기는데 이 경우 다음과 같이 하면 된다.

ping -n 초 127.0.0.1 >nul

또는

timeout /t 초 /nobreak > NUL


timeout 은 Windows 7 에서부터 되는 거 같은데(XP에선 없었던 거 같은데..) 유용하다. /nobreak 옵션을 주면 배치 파일에서 Ctrl + C를 눌러도 멈출 수가 없으니 웬만하면 빼자-_-;;



파일 만들기(***.bat)

[방법]

c:\>copy con ***.bat

CLS

DIR

^Z

 

기본 명령어

(1) 일반적인 도스명령를 그대로 사용한다.

(2) 배치에만 사용하는 전용 명령가 있다.

  1. REM       
    : 배치파일 속에 달고 싶은 설명, 주석
  2. PAUSE     
    : 배치파일 실행중 일시 멈추게함
  3. ECHO "문자열"
    : 에코명령 다음에 오는 문자열을 화면에 나타낸다.
  4. ECHO ON
    : 이후부터 '명령어'라인을 화면에 보인다.
  5. ECHO OFF
    : 이후 실행되는 명령어 라인을 화면에 나타내지 않는다.
  6. @ECHO OFF 
    : 'ECHO OFF'라는 그 자체까지 보이지 않게 한다.
  7. ECHO
    : 현재 ECHO ON/OFF 상태를 확인한다.

분기 명령어

: 배치파일의 순차적 수행을 필요에 따라 변경할 때 사용한다.

 

(1) CALL

: 배치파일 실행 중 다른 배치파일을 호출하여 실행시키고 다시 원래의 배치파일로 돌아오게 하는 명령이다.

[문법] 

CALL "파일명"

[보기]

c:\>COPY CON file1.bat

DIR C:\ > C:DIRList.TXT

^Z

c:\>COPY CON file2.bat
CALL file1.bat
TYPE C:DIRList.TXT

^Z

[설명]

"file2.bat"을 실행하면 "file1.bat"란 배치파일을 불러(CALL) 실행하여 "DIRList.TXT"파일을 만든 후, 다시 "file2.bat"파일로 돌아와 "DIRList.TXT"파일을 화면에 출력한다.

 

(2) IF

: 주어진 조건에 따라 명령을 선별적으로 선택, 실행하는 명령이다.

[문법]

  1. IF EXIST [파일이름] [명령] 
    : 찾는 파일이 존재하면 명령을 실행하라
  2. IF NOT EXIT [파일이름] [명령] 
    : 찾는 파일이 없으면 명령을 실행하라
  3. IF "문자열1" == "문자열2" [명령]
    : "문자열1"과 "문자열2"가 서로 일치하면 명령을 실행하라.
  4. IF NOT "문자열1" == "문자열2" [명령]
    : "문자열1"과 "문자열2"가 서로 불일치하면 명령을 실행하라.
  5. IF ERRORLEVEL [값] [명령]
    : IF명령 바로 앞에서 수행되었던 프로그램이 수행을 마치면서 남긴 종료코드(ExitCode)를 검사하여 지정 값보다 크면 명령을 실행하라는 뜻이다.
  6. IF [NOT] ERRORLEVEL [값] [명령]
    : IF명령 바로 앞에서 수행되었던 프로그램이 수행을 마치면서 남긴 종료코드(ExitCode)를 검사하여 지정 값보다 작으면 명령을 실행하라는 뜻이다.

[보기]

  • IF EXIST *.BAK DEL *.BAK
    : BAK라는 백업파일이 있으면 모두 지워버리라.
  • c:\>COPY CON TEST1.BAT
    @ECHO OFF
    IF "%1" == "A" ECHO TESTING A
    IF NOT "%1" == "A" ECHO IT IS NOT EQUAL.
    ^z 
    : c:\>TEST1 A 엔터하면 화면에 "TESTING A"라고 표시한다.
    : c:\>TEST1 C 엔터하면 A와 같지 않으므로 "IT IS NOT EQUAL"라고 표시한다.
  • c:\>COPY CON XY.BAT
    XCOPY %1 A:
    IF NOT ERRORLEEVEL 0 ECHO COPY FAILED !
    IF ERRORLEVEL 0 ECHO SUCCESSFULLY !
    ^Z 
    : c:\>XY *.* 엔터하면 성공적 수행여부에 따라  'FAILED !' 또는 'SUCCESSFULLY !' 라는 메시지가 나온다.

(3) GOTO

: 레이블 이름이 있는 행으로 실행 순서를 옮긴다. '레이블(Label)'은 8자이 내로, 레이블 앞에는 콜론(:)을 사용한다.

[문법]

GOTO 레이블

:레이블

[보기]

c:\>COPY CON HWPMV.BAT
@ECHO OFF
IF NOT EXIST *.HWP GOTO FIRST
MOVE /-Y *.HWP C:\HNCDOC
ECHO HWPFILE MOVE DONE !
GOTO END
:FIRST
ECHO *.HWP FILE NOT FOUND !
:END
^Z

[설명]

"HWPMV.BAT"을 실행하면 현재 디렉토리에 있는 모든 HWP 파일을 "c:\HNCDOC" 디렉토리로 옮기고 "HWPFILE MOVE DONE !" 메시지를 화면에 보이고 END 레이블로 와서 배치파일을 종료한다. 옮길 HWP 파일이 없으면 "*.HWP FILE NOT FOUND !" 메시지가 나오고 배치파일을 종료한다.

 

(4) 변수

: 바꿔 쓸 수 있는 인자(Replaceable Parameter)를 의사변수라 하며, %0 ~ %9(10개)으로 표시한다.

[문법]

c:\>명령어 파일1 파일2   "    "   "   "   "   "          파일9
         %0      %1    %2  %3  %4  %5  %6  %7  %8  %9

[보기]

c:\>COPY CON DIRALL.BAT
DIR %1
pause
DIR %2
pause
type %0
^Z

[설명]

"c:\>DIRALL A: B:" + (엔터) 명령어 DIRALL(.BAT)은 %0, A:은 %1, B:은 %2 에 해당하므로 '작성예1'의 내용 중 %1,%2,%0에 대입하여 명령을 수행한 결과가 화면에 나오게 된다. 즉 화면에는 'DIR A:'과, 'DIR B:'이 차례로 출력되고 멈췄다가 'DIRALL.BAT' 파일 내용이 출력된다.

 

(5) 기타변수

[보기]

c:\dev\walp>test.bat
~dps0: C:\dev\walp\
~dp0: C:\dev\walp\
~s0: C:\dev\walp\test.bat
~0: test.bat
~dps0\..: C:\dev\walp\\..
~dps0..: C:\dev\walp\..


(6) SHIFT

: 쉬프트는 옮김, 변위를 의미하는 데 10개 이상의 대체 인자도 사용 가능하다. 대체인자를 한 자리씩 왼쪽으로 이동한다.

[보기]

: 지정한 문장(text) 파일들을 차례로 TYPE시키는 배치파일 예.

c:\>COPY CON TELLME.BAT
@ECHO OFF
:BEGIN
IF NOT EXIST %1 GOTO END
TYPE %1
SHIFT
GOTO BEGIN
:END
ECHO 더이상 파일이 없습니다.
^Z

[설명]

"c:\>TELLME AAA.TXT BBB.TXT CCC.TXT .........  " + (엔터)
           %0     %1       %2      %3     ........%15

텍스트 파일명은 특정해야 하며 Wildcard문자(*,?)는 사용할 수 없다. 지정된 여러 파일들에 %1 변수가 차례로 SHIFT(변위)되면서 파일을 대입시켜 내용을 출력한다.
즉, AAA.TXT가 먼저 %1이 되고, 다음 BBB.TXT, 또 CCC.TXT, ... 등이 %1에 대입된다. 계속 10개 이상의 변수도 지정할 수 있다.

지정된 파일이 모두 옮겨 대입되고 나면 배치파일이 끝나게 된다. 배치파일 내용 중 GOTO 명령에서 BEGIN 레이블로 가서 다시 시작하게하는 것을 LOOP(고리)라고 한다.

 

(7) FOR
: FOR 명령은 지정된 횟수 만큼 배치파일이 같은 명령을 계속 반복하게하는 명령, 즉 반복수행(Looping) 명령이다.

[문법]

FOR %%변수 IN (셋트 파라미터) DO [명령어] %%변수

: '(셋트 파라미터)'는 일련의 많은 갯수의 파일들을 말하고, '%%변수'는 SET에 명시된 각 파일에 순차적으로 설정되어 명령을 실행하는 대입변수이다. (셋트 파라미터에 와일드카드문자(*,?)를  사용할 수 있다.)

[보기]

: 확장명이 BAT,DOC,TXT,CAP인 문장 파일 모두를 차례로 화면에 출력(TYPE)되게 배치파일을 만들어 보자.

c:\>COPY CON TYPEALL.BAT

FOR %%Z IN (*.BAT *.DOC *.TXT *.CAP) DO TYPE %%Z
^Z



 


출처 http://ohgyun.com/173
출처 http://fuzzer4life.blogspot.kr/2013/06/sleep.html
출처 http://blog.naver.com/6420h?Redirect=Log&logNo=60095322019





Posted by 장안동베짱e :