프로그래밍/기타...2018. 3. 7. 09:45

참고 : https://blog.naver.com/powerms100/120008462157


자세한 설정내용은 위 블로그를 참고하셔도 좋습니다.


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

rem oracle backup 

@echo off

SET ORACLE_SID=ORAGEO

SET MONTH=%date:~5,2%

SET YEAR=%date:~0,4%

for %%a in (%date%) do SET day=%%a

md D:\DB백업\%YEAR%\%MONTH%\dmp

md D:\DB백업\%YEAR%\%MONTH%\log

C:\oracle\product\10.2.0\db_1\BIN\EXP 아이디/비번 file=D:\DB백업\%YEAR%\%MONTH%\dmp\%DAY%.dmp log=D:\DB백업\%YEAR%\%MONTH%\log\%DAY%backuplog.txt

rem 매일 새벽 5시에 export 받는 작업 예약하기

rem C:\> at 05:00 /every:Su,M,T,W,Th,F,S D:\bak\bat\oracle_exp.bat

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

사실 위와같은 내용으로 사용중에 오라클DB백업을 사용중에 있는것을 확인하였는데, 

인터넷을 검색하니 위 내용으로 예시가 올라와 있더라구요ㅎ 

배치파일은 위 내용을 포함하는 .bat 파일을 만들어 주면 됩니다. 

위 내용을 만들어진 만들어진 .bat 파일을 스케줄러에 등록해야하는데요 아래와 같이 등록을 합니다.


1. 윈도우 -> 실행 , 사진과같이 검색하여 '작업 스케줄러'를 살행




2. 실행 된 작업 스케줄러 '작업 스케줄러 라이브러리' 에 오른버튼을 이용하여 '작업만들기' 실행




3. '새 작업 만들기' 창이 뜨면 이름에 설정하고자 하는 내용을 기록



4.  트리커 탭에서 '새로 만들기' 선택



5. '새 트리가 만들기' 화면이 뜨면 '설정' 부분을 설정한다.

- 한번, 매일, 매주, 매월

- 시작 시간 설정



5. 동작 탭으로 이동하여 '새로 만들기' 선택



6. 실행 된 '새 동작 만들기' 창에서 '설정-찾아보기' 버튼을 이용하여 .bat 파일을 선택하고 '확인버튼' 선택



7. 아래와 같이 스케줄이 등록 된 것을 확인할 수 있다. 




8. 설정 된 시간에 dump 파일이 잘 생성됨을 확인 할 수 있음 . 끝~~~~~


Posted by 컴투
프로그래밍/C/C++2018. 3. 6. 11:05

부록 G. 도스(DOS) 배치 파일을 쉘 스크립트로 변환

아주 많은 프로그래머들은 PC 위에서 도는 도스에서 스크립트를 배웠습니다. 기능이 조금 떨어지는 도스 배치 파일 언어로도 꽤 강력한 스크립트나 어플리케이션을 작성할 수도 있지만 그렇게 하려면 아주 해박한 지식을 사용해 해결책을 찾거나 꽁수를 부려야 합니다. 가끔은 오래된 도스용 배치 파일을 유닉스 쉘 스크립트로 변환해서 써야될 경우가 생기지만 이렇게 하는것이 그렇게 어렵지만은 않습니다. 왜냐하면 도스 배치 파일 연산자들이 기능이 동일한 쉘 스크립트 연산자의 서브셋에 불과하기 때문입니다.

표 G-1. 배치 파일 키워드/변수/연산자 와 그에 해당하는 쉘 동의어

배치 파일 연산자쉘 스크립트 동의어
%$명령어줄 매개변수 접두사
/-명령어 옵션 플래그
\/디렉토리 패스 구분자
===(같음) 문자열 비교 테스트
!==!!=(다름) 문자열 비교 테스트
||파이프
@set +v현재 명령어를 에코하지 말 것
**파일명 "와일드 카드"
>>파일 재지향(덮어 쓰기)
>>>>파일 재지향(덧붙여 쓰기)
<<표준입력 재지향
%VAR%$VAR환경 변수
REM#주석
NOT!뒤에 나오는 테스트 부정
NUL/dev/null명령어 출력을 없애기 위한 "블랙홀"
ECHOecho에코 (Bash 에는 옵션이 많이 있음)
ECHO.echo빈 줄 에코
ECHO OFFset +v다음에 나오는 명령어를 에코하지 말 것
FOR %%VAR IN (LIST) DOfor var in [list]; do"for" 루프
:LABEL없음 (필요치 않음)라벨
GOTO없음 (대신 함수를 씀)스크립트의 다른 곳으로 건너 뜀
PAUSEsleep일정 간격을 두고 잠시 대기
CHOICEcase 나 select메뉴 선택
IFifif-test
IF EXIST FILENAMEif [ -e filename ]파일이 존재하는지 확인
IF !%N==!if [ -z "$N" ]변경가능한 매개변수인 "N"이 없다면
CALLsource 나 . (도트 연산자)다른 스크립트를 "포함"
COMMAND /Csource 나 . (도트 연산자)다른 스크립트를 "포함"(CALL과 동일)
SETexport환경 변수를 세트
SHIFTshift명령어줄 변수 목록을 왼쪽으로 이동(shift)
SGN-lt or -gt(정수) 부호(sign)
ERRORLEVEL$?종료 상태
CONstdin"콘솔"(표준입력)
PRN/dev/lp0(일반적인) 프린터 디바이스
LP1/dev/lp0첫번째 프린터 디바이스
COM1/dev/ttyS0첫번째 시리얼 포트

배치 파일은 대개 도스 명령어를 갖고 있습니다. 도스용 배치 파일이 쉘 스크립트로 변환되기 위해서는 이 명령어들은 꼭 동일한 유닉스 명령어로 변환되어야 합니다.

표 G-2. 도스 명령어와 동일한 유닉스 명령어

도스 명령어동일한 유닉스 명령어효과
ASSIGNln파일이나 디렉토리를 링크
ATTRIBchmod파일 퍼미션 변경
CDcd디렉토리 변경
CHDIRcd디렉토리 변경
CLSclear스크린 지우기
COMPcmp or diff파일 비교
COPYcp파일 복사
Ctl-CCtl-C정지(시그널)
Ctl-ZCtl-DEOF (end-of-file)
DELrm파일 삭제
DELTREErm -rf디렉토리의 하위 디렉토리까지 포함해서 삭제
DIRls -l디렉토리 보이기
ERASErm파일 삭제
EXITexit현재 프로세스 종료
FCcomm, cmp파일 비교
FINDgrep파일안에서 문자열 찾기
MDmkdir디렉토리 생성
MKDIRmkdir디렉토리 생성
MOREmore텍스트 파일 쪽단위(paging) 필터
MOVEmv이동
PATH$PATH실행파일들의 경로
RENmv이름 바꾸기(이동)
RENAMEmv이름 바꾸기(이동)
RDrmdir디렉토리 삭제
RMDIRrmdir디렉토리 삭제
SORTsort파일 정렬
TIMEdate시스템 시간 보여주기
TYPEcat파일을 표준출력으로 출력
XCOPYcp(확장) 파일 복사

참고: 사실 모든 유닉스, 쉘 연산자, 명령어들은 그들과 동일한 도스용보다 많은 옵션과 강력한 기능을 갖고 있습니다. 많은 배치 파일 스크립트들은 read의 불완전한 버전인 ask.com같은 외부 유틸리티에 의존합니다.

도스는 파일명 와일드 카드 확장에 대해서 오직 *과 ? 문자만을 인식하는 제한되고 부족한 서브셋을 지원합니다.

도스 배치 파일을 쉘 스크립트로 변환하는 것은 일반적으로 매우 간단하고 가끔은 변환된 쉘 스크립트가 원래 도스 배치 파일보다 더 이해하기 쉬운 경우도 있습니다.

예 G-1. VIEWDATA.BAT: 도스용 배치 파일

REM VIEWDATA

REM PAUL SOMERSON의 "DOS POWERTOOLS"의 예제에서 영감을 받아 작성


@ECHO OFF

IF !%1==! GOTO VIEWDATA
REM  명령어줄 인자가 없다면...
FIND "%1" C:\BOZO\BOOKLIST.TXT
GOTO EXIT0
REM  문자열이 일치하는 줄을 출력후 종료.

:VIEWDATA
TYPE C:\BOZO\BOOKLIST.TXT | MORE
REM  한 번에 한 쪽씩 전체 파일을 보여줌.

:EXIT0

스크립트 변환을 하면 기능이 다소 개량됩니다.

예 G-2. viewdata.sh: VIEWDATA.BAT 의 스크립트 버전

#!/bin/bash
# VIEWDATA.BAT 를 쉘 스크립트로 변환.

DATAFILE=/home/bozo/datafiles/book-collection.data
ARGNO=1

# @ECHO OFF       여기서 이 명령어는 필요없습니다.

if [ $# -lt "$ARGNO" ]    # IF !%1==! GOTO VIEWDATA
then
  less $DATAFILE          # TYPE C:\MYDIR\BOOKLIST.TXT | MORE
else
  grep "$1" $DATAFILE     # FIND "%1" C:\MYDIR\BOOKLIST.TXT
fi  

exit 0                    # :EXIT0

# GOTO, 라벨, 속임수, 엉터리 구문등이 필요없어졌죠.
# 원래 배치 파일보다 더 짧고, 더 쉽고, 더 깔끔합니다.



참고 : http://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/dosbatch.html

Posted by 컴투
프로그래밍/C/C++2013. 8. 13. 14:13

내가 만드는 프로그램을 항상 하나만 실행하도록 하려면 어떻게 해야 하나 ? 그리고 두 번째 실행시에는 먼저 실행되어 있던 프로그램을 앞으로 띄우고 싶다.

만일 프로그램의 캡션이 고정되어 있다든가 사용되는 윈도우의 클래스 이름을 알고 있다면 FindWindow 혹은 FindWindowEx를 사용하면 아주 손쉽게 문제를 해결할 수 있다. 하지만 윈도우의 캡션이 계속적으로 변한다든지 윈도우 클래스 이름을 모르는 경우에는 이것으로 해결책이 되지 못한다. MFC를 사용할 경우가 대표적인데 윈도우 클래스의 이름을 MFC 내부에서 만들어 사용하기 때문에 윈도우 클래스를 직접 등록하여 사용하는 고난도의 기술을 사용하기 이전에는 윈도우 클래스의 이름을 알 수가 없다. 해결책에는 여러 가지 방법이 있겠지만 파일 맵핑 객체를 이용하도록 하겠다. 원래 파일 맵핑 객체의 목적은 여러 프로세스간에 데이터를 주고 받기 위해 사용되며 사용 방식 자체는 기존의 동적 메모리 할당 방식과 흡사하다.
간단히 절차를 설명하면 다음과 같다. 처음 뜨는 프로그램이 정해진 이름의 파일 맵핑 객체(여기서는 이름은 My TestMap)를 만들어 놓는다. 그리고 나서 자신의 메인 윈도우의 핸들을 그 객체에 기록해 놓는다. 이 때 다시 그 프로그램을 실행시키면 이 이름의 파일 맵핑 객체가 있는지 살펴보고 있으면 실행을 중지한다. 그리고 파일 맵핑 객체에 기록되어 있는 윈도우의 핸들값을 읽어서 앞으로 띄워 버린다. 이것이 가능한 이유는 파일 맵핑 객체는 시스템 전역 객체이기 때문이다. 즉 한 프로세스에서 만들어도 다른 프로세스에서 접근할 수 있다. 먼저 항상 하나만 떠 있게 하는 방법을 알아보고 다음으로 기존의 프로그램을 앞으로 띄우는 코드를 알아보도록 하겠다. 사실 아래의 코드를 이해하려면 파일 맵핑 객체에 대해 알아야 하는데 그것 자체에 대한 설명은 생략하기로 하겠다.

항상 하나만 떠 있게 하는 방법
다음 코드를 애플리케이션 클래스의 InitInstance의 선두에 넣는다. 파일 맵핑 객체의 크기를 4바이트로 잡은 이유는 윈도우 핸들이 UINT이고 그 크기가 4바이트이기 때문이다. CreateFileMapping API는 파일 맵핑 객체를 생성할 때 사용되는데, 이름과 크기를 줄 수 있다. 이미 존재하는 이름으로 파일 맵핑 객체를 생성하려고 하면 GetLast Error라는 API를 호출했을 때 ERROR_ALREADY_ EXISTS라는 에러 코드가 리턴된다. 이것으로 먼저 실행된 프로그램이 있는지 알아낼 수 있다.

HANDLE hMapping;

// MyTestMap이란 이름으로 4바이트의 영역을 잡는다
hMapping = CreateFileMapping( (HANDLE) 0xffffffff, NULL,
PAGE_READWRITE, 0, 4, “MyTestMap” );
if (hMapping)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
// 같은 이름의 파일 맵핑 객체가 존재
{
// 프로그램이 이미 실행중임을 알리는 메시지를 띄운다.
MessageBox( NULL, “이미 실행 중입니다.”, “경고”, MB_OK );
return FALSE;
}
}
위의 코드는 하나의 실행파일을 실행할 수 있는 방법이지만 기존에 실행되어 있는 프로그램을 앞으로 띄우는 일까지 할 수는 없다. 그렇게 하고 싶다면 InitInstance의 코드의 끝 부분에 메인 윈도우의 핸들을 파일 맵핑 객체에 저장하는 코드를 추가한다. 아래의 예는 SDI(Single Document Interface) 혹은 MDI(Multiple Document Interface)형식의 프로젝트인 경우의 예이다. 만일 다이얼로그 기반의 프로젝트라면 아래의 코드는 메인 다이얼로그 클래스의 WM_CREATE 메시지나 OnInitDialog 함수에 추가되어야 한다. CreateFileMapping으로 생성된 파일 맵핑 객체는 MapViewOfFile이란 API를 통해 메모리 포인터로 변환할 수 있다. 즉 할당된 파일 맵핑 객체를 접근할 수 있는 메모리 포인터를 사용해 내용을 읽고 쓰고 할 수 있다.

LPDWORD lpDword;

// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// ---------------------------------
// 이번에는 파일 맵핑 객체를 쓰기 모드로 오픈한다.
lpDword=(LPDWORD)MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 4);
// 메인 윈도우의 핸들을 저장한다.
*lpDword = (DWORD)m_pMainWnd->m_hWnd;
UnmapViewOfFile(lpDword);
// ---------------------------------
m_pMainWnd->ShowWindow(SW_SHOW);
그러면 앞서 살펴보았던 두 번째로 뜨는 프로그램인지 체크하는 코드 부분을 보강해 보자. 두 번째 뜨는 프로그램일 경우에 원래 먼저 떴던 프로그램의 메인 윈도우를 앞으로 내세우는 코드를 추가해 보자.

hMapping = CreateFileMapping( (HANDLE) 0xffffffff, NULL,
PAGE_READWRITE, 0, 32, “MyTestMap” );
if (hMapping)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
// 같은 이름의 파일 맵핑 객체가 존재
{
// 프로그램이 이미 실행 중임을 알리는 메시지를 띄운다.
MessageBox( NULL, “이미 실행 중입니다.”, “경고”, MB_OK );

// 기존 파일 맵핑 객체를 연다. 기존 파일 맵핑 객체의 선두에 이전 프로그램
// 의 메인 윈도우 핸들이 들어있다. 뒷부분의 코드를 보면 알 것이다.
LPDWORD lpDword;
HWND hWnd;
// 파일 맵핑 객체를 읽기 모드로 오픈한다.
hMapping = OpenFileMapping(FILE_MAP_READ, FALSE,
“MyTestMap”);
// 파일 맵핑 객체 핸들로부터 포인터를 얻어낸다.
lpDword = (LPDWORD)MapViewOfFile(hMapping,
FILE_MAP_READ, 0, 0, 4);
// 저장되어 있던 윈도우 핸들을 얻어낸다.
hWnd = (HWND)*lpDword;

// 윈도우를 전면으로 내세우기 전에 먼저 아이콘 상태에 있을지도 모르는
// 윈도우를 원래 크기로 되돌린다. IsIconic 함수를 호출하여 아이콘 상태
// 여부를 확인해도 될 것이다.
ShowWindow(hWnd, SW_SHOW);
// 윈도우를 전면으로 내세운다.
SetForegroundWindow(hWnd);
// 파일 맵핑 객체를 닫는다.
UnmapViewOfFile(lpDword);
return FALSE;
}
위의 코드에서 윈도우를 전면으로 내세우는데 SetFore groundWindow라는 함수를 사용한다는 것을 기억해 두기 바란다. 이 함수의 인자로는 반드시 메인 윈도우의 핸들을 지정해야 한다. 지금까지 살펴보았던 코드를 다시 전체적으로 정리하면 다음과 같다.

HANDLE hMapping;

hMapping = CreateFileMapping( (HANDLE) 0xffffffff, NULL,
PAGE_READWRITE, 0, 32, “MyTestMap” );
if (hMapping)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
// 같은 이름의 파일 맵핑 객체가 존재
{
// 프로그램이 이미 실행 중임을 알리는 메시지를 띄운다.
MessageBox( NULL, “이미 실행 중입니다.”, “경고”, MB_OK );

// 기존 파일 맵핑 객체를 연다. 기존 파일 맵핑 객체의 선두에 이전 프로그램의
// 메인 윈도우 핸들이 들어있다. 뒷부분의 코드를 보면 알 것이다.
LPDWORD lpDword;
HWND hWnd;
// 파일 맵핑 객체를 읽기 모드로 오픈한다.
hMapping = OpenFileMapping(FILE_MAP_READ, FALSE,
“MyTestMap”);
// 파일 맵핑 객체 핸들로부터 포인터를 얻어낸다.
lpDword = (LPDWORD)MapViewOfFile(hMapping,
FILE_MAP_READ, 0, 0, 4);
// 저장되어 있던 윈도우 핸들을 얻어낸다.
hWnd = (HWND)*lpDword;

// 윈도우를 전면으로 내세우기 전에 먼저 아이콘 상태에 있을지도 모르는
// 윈도우를 원래 크기로 되돌린다. IsIconic 함수를 호출하여 아이콘
// 상태 여부를 확인해도 될 것이다.
ShowWindow(hWnd, SW_SHOW);
// 윈도우를 전면으로 내세운다.
SetForegroundWindow(hWnd);
// 파일 맵핑 객체를 닫는다.
UnmapViewOfFile(lpDword);

return FALSE;
}
// 이 뒤부터 ------ 까지는 원래 InitInstance 코드
.....
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// --------------
// 다음을 추가한다.
LPDWORD lpDword;

lpDword = (LPDWORD)MapViewOfFile(hMapping, FILE_MAP_WRITE,
0, 0, 4);
*lpDword = (DWORD)m_pMainWnd->m_hWnd;
UnmapViewOfFile(lpDword);
// 이 뒤로는 다시 원래 InitInstance의 코드
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();



출처 : www.codeland.co.kr

[펌]http://snslab.kangwon.ac.kr/home/?bo_table=openclass&doc=bbs/gnuboard.php&wr_id=132

Posted by 컴투
프로그래밍/C/C++2013. 7. 10. 08:59

원래 thread 함수 내부에서는 Updatedata를 사용할 수 없다.
하지만 Dlg클래스에 사용자 메시지를 등록하여
thread 함수에서 이에 접근하는 방법으로 사용가능하다.

 

1. 다음과 같이 Dialog class에 멤버함수로 UpdateData를 실행하는 함수를 만들어 준다.

LRESULT ___Dlg::OnUpdateDataFalse(WPARAM wParam, LPARAM lParam)
{
     return UpdateData(FALSE);
}


LRESULT ___Dlg::OnUpdateDataTrue(WPARAM wParam, LPARAM lParam)
{
     return UpdateData(TRUE);
}

 


2. stdafx.h 에 사용할 사용자 정의 메시지를 정의한다.

//사용자 정의 메시지
#define UM_UPDATEDATAFALSE (WM_USER+1)  //thread 에서 updatedata를 사용하기 위한 사용자 message
#define UM_UPDATEDATATRUE (WM_USER+2)

 

3. ___Dlg.cpp 의
   BEGIN_MESSAGE_MAP 에
   정의한 사용자 메시지를 등록해 준다.

BEGIN_MESSAGE_MAP(.......(생략) )
.......(생략)
 ON_MESSAGE(UM_UPDATEDATAFALSE, OnUpdateDataFalse) //thread 에서 updatedata 를 사용하기 위한 사용자메시지 처리
 ON_MESSAGE(UM_UPDATEDATATRUE, OnUpdateDataTrue)  //thread 에서 updatedata 를 사용하기 위한 사용자메시지 처리

END_MESSAGE_MAP()

 

4. thread를 시작할 때 현재 Dialog의 핸들을 인수로 넘겨주면서 시작한다.
   (-> 작업자 thread 함수는 전역 함수이므로(dialog의 멤버 함수가 아님))
   (-> Dialog class 의 멤버들을 사용할 수 있게 하기 위함.)

  AfxBeginThread(thread작업함수이름,this);

 

5. thread작업함수 에서 dialog class 의 멤버들을 가져다 쓰기위한 pointer 를 선언/할당 한다.

UINT ThreadDataSave(LPVOID pParam)
{
   ___Dlg* pDlg = (___Dlg*)pParam;

   ...(생략)
}

 

6. thread 에서 dialog class의 메시지에 접근하여 updatedata 를 실행한다.

UINT ThreadDataSave(LPVOID pParam)
{
   ___Dlg* pDlg = (___Dlg*)pParam;

   ...(생략)
   pDlg->PostMessage(UM_UPDATEDATAFALSE);
   pDlg->PostMessage(UM_UPDATEDATATURE);
}

출처 : http://bluebearworld.tistory.com/147

Posted by 컴투
프로그래밍/C/C++2013. 5. 30. 15:42

LINK : fatal error LNK1104: 'LIBC.lib' 파일을 열 수 없습니다.



코딩중에 갑자기 처음보는 에러가 나와서 당황했다.

해당 오류의 원인은 Visual Studio가 이제 더이상 단일쓰레드를 지원하지 않아서 라고 한다.

그럼 해결방법은 어떻게 되는것인가?


해당 라이브러리를 무시하면 된다고 한다.


프로젝트 -> 프로젝트 속성 -> 구성 속성 -> 링커 ->입력 까지 들어가면 

특정 라이브러리 무시 칸이있다 여기에 

libc.lib; 를 쓰고 확인을 누른다.




이렇게 해당 속성을 건드려 준뒤에 빌드를 하니

성공메시지가 떴다.

 

[출처] http://stackov.tistory.com/2

Posted by 컴투