배치파일에서 문자열 자르기 (부분 추출)

윈도우즈/OS 일반|2020. 6. 9. 07:41
반응형

배치스크립트 내에서는 변수 사용이 가장 빈번한데요,
아래는 변수를 이용해 문자열을 변경하거나 원하는 부분만 추출하는 예시 입니다.

set var=0123456789      // var 변수 "0123456789" 로 초기화
echo %var%              // var 변수 출력
echo %var:123=abc%      // var 변수의 "123" 을 "abc" 로 바꿔 출력
echo %var:123=%         // var 변수의 "123" 을 지워서 출력
echo %var:~0%           // var 변수의 첫번째 부터 출력
echo %var:~-5%          // var 변수의 맨뒤에서 부터 5개 출력
echo %var:~0,2%         // var 변수의 0번째 부터 2개 출력
echo %var:~0,-2%        // var 변수의 0번째 부터 출력하는데 맨뒤 2개 빼고 출력
echo %var:~-2,3%        // var 변수의 맨뒤 2번째 부터 3개 출력
echo %var:~-2,-3%       // var 변수의 맨뒤 2번째 부터 3개 빼고 출력
set var=                // var 변수 지우기


[출처] http://egloos.zum.com/appleiii/v/5805857

반응형

댓글()

[배치파일][번역] 특수문자 처리 방법

윈도우즈/OS 일반|2020. 6. 8. 16:43
반응형


특수 문자 처리 방법
처리한 특수문자처리 방법

참고사항

%%%

큰따옴표 안의 문자열에서는 꼭 필요하지 않을 수 있습니다. 시도해 보세요.

^^^

큰따옴표 안의 문자열에서는 꼭 필요하지 않을 수 있습니다. 하지만 오류는 없습니다.

&^&
<^<
>^>
|^|
'^'

backq 이 사용되지 않는 경우 FOR /F "subject" (괄호 사이의 것) 인 경우에만 사용합니다

`^`backq 이 사용되는 경우 FOR /F "subject" (괄호 사이의 것) 인 경우에만 사용합니다
,^,

큰따옴표 처리된 문자열이라 해도  FOR /F "subject" (괄호 사이의 것) 인 경우에만 사용합니다

;^;
=^=
(^(
)^)
!^^!

delayed variable expansion 이 활성화 된 경우에만 사용합니다.

"""

FIND  서치패턴의 안에서만 사용합니다

\\\

FINDSTR의 regex 패턴인 경우에만 사용합니다.

[\[
]\]
"\"
.\.
*\*
?\?



[출처] https://contain.tistory.com/entry/%EB%B0%B0%EC%B9%98%ED%8C%8C%EC%9D%BC%EB%B2%88%EC%97%AD%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EB%B2%95



반응형

댓글()

html 테이블 내용에 따라 가로 사이즈가 늘어나지 않게하기

반응형

텍스트 가로 사이즈가 길어서 테이블이 정해놓은 가로 사이즈가 늘어날 때가 있습니다.

이 경우 <td> 속성에 아래와 같이 옵션을 주면 텍스트 내용이 길 경우 줄바꿈으로 표시가 됩니다.


<td style='word-break:break-all'>



반응형

댓글()

cmd 에서 웹서버로 데이터 전송시 한글깨짐 (cp949 > utf-8)

윈도우즈/OS 일반|2020. 6. 7. 19:51
반응형

[상황]

윈도우에서 MySQL (UTF-8) 을 이용하는데 아래와 같은 증상이 발견 되었다.

 

(명령프롬프트에서)

MySQL 명령으로 쿼리시 한글 잘 보임, INSERT, SELECT 등의 작업이 잘 됨.

하지만, 쿼리 결과를 파일로 저장하거나 ( > result.txt) 변수에 결과를 담으면 한글이 깨져보인다.

 

chcp 명령으로 확인하니 euc-kr 의 확장판인 cp 949 이며, chcp 65001 명령으로 명령프롬프트를 UTF-8 로 바꾸니 결과는 잘 저장되지만, 또 다른 한글이 쓰여진 파일은 반대로 깨져보인다.

 

그때는 chcp 명령을 통해 적절히 언어셋 환경을 바꿔가면서 작업하면 된다.

그리고 웹서버로의 데이터 전송은 curl 을 사용한다면, get 방식 보다는 post 방식으로 전송해야 깨지지 않을 것이다.

 

# send.bat

@echo off
 
:: 먼저 DB 에서 한글 데이터 가져올때는 utf-8 로 가져오고
chcp 65001
FOR /F "tokens=* USEBACKQ" %%F IN (`c:\mysql\bin\mysql.exe -usysdocu -p"12345678" testdb -N -e "select name from members where id='12'"`) DO ( SET var=%%F )
 
:: 파일에서 한글 데이터 가져올때는 949 로 가져온다.
chcp 949
set /p area=<C:\area.txt
 
:: 그러면 둘다 한글이 잘 표기된다.
curl -d "name=%var%" -d "area=%area%"  http://sysdocu.tistory.com/test.php

 

반응형

댓글()

배치파일 실행시 명령 프롬프트 창 보이지 않게 하기

윈도우즈/OS 일반|2020. 6. 7. 09:11
반응형

vbs 파일을 하나 만들고, 그 안에서 실행할 명령과 속성을 입력합니다.

그리고 생성한 run.vbs 를 대신해서 실행하면 됩니다.

 

run.vbs

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "c:\another.bat" & Chr(34),0
Set WshShell = Nothing

 

* 명령프롬프트에서 vbs 로 인자값 넘기고, 다시 인자값을 배치파일로 넘길때

c:\> run.vbs sys docu

Dim Arg, var1, var2
Set Arg = WScript.arguments
var1 = Arg(0)
var2 = Arg(1)


Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & ["C:\another.bat var1 var2"] & Chr(34), 0
Set WshShell = Nothing



 

 

반응형

댓글()

on,off 스위치 만들기 (토글버튼: Togglebutton)

반응형

<html>

<head>


<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>


<style>

.switch {

  position: relative;

  display: inline-block;

  width: 60px;

  height: 34px;

  vertical-align:middle;

}


/* Hide default HTML checkbox */

.switch input {display:none;}


/* The slider */

.slider {

  position: absolute;

  cursor: pointer;

  top: 0;

  left: 0;

  right: 0;

  bottom: 0;

  background-color: #ccc;

  -webkit-transition: .4s;

  transition: .4s;

}


.slider:before {

  position: absolute;

  content: "";

  height: 26px;

  width: 26px;

  left: 4px;

  bottom: 4px;

  background-color: white;

  -webkit-transition: .4s;

  transition: .4s;

}


input:checked + .slider {

  background-color: #2196F3;

}


input:focus + .slider {

  box-shadow: 0 0 1px #2196F3;

}


input:checked + .slider:before {

  -webkit-transform: translateX(26px);

  -ms-transform: translateX(26px);

  transform: translateX(26px);

}


/* Rounded sliders */

.slider.round {

  border-radius: 34px;

}


.slider.round:before {

  border-radius: 50%;

}


p {

margin:0px;

display:inline-block;

font-size:15px;

font-weight:bold;

}

</style>


</head>


<body>


<label class="switch">

<input type="checkbox">

<span class="slider round"></span>

</label>


<p>OFF</p>

<p style="display:none;">ON</p>


<script>

var check = $("input[type='checkbox']");

check.click(function(){

$("p").toggle();

});

</script>


</body>

</html>



[출처] https://imivory.tistory.com/15

반응형

댓글()

CMD 에서 명령 결과를 변수에 저장하기

리눅스/OS 일반|2020. 6. 4. 17:00
반응형
명령프롬프트에서 실행
(배치파일에서 사용할때는 %F 대신 %%F 를 사용)

FOR /F "tokens=* USEBACKQ" %F IN (`c:\mysql\bin\mysql.exe -uID -p"PW" test -N -e "select name from members where id='12'"`) DO ( SET var=%F )

이렇게 명령을 수행한 경우 var 라는 변수에 들어갑니다.

* 참고
내용 확인은 아래와 같이 합니다.

echo %var%



반응형

댓글()

cp949 형태의 문자를 utf-8 로 변환하기

프로그래밍/PHP|2020. 6. 4. 10:23
반응형

[ 소스 ]

$ori = "\xb9\xae\xc0\xda\xba\xaf\xc8\xaf\xc5\xd7\xbd\xba\xc6\xae";

echo iconv("CP949", "UTF-8", $ori );



[ 결과 ]

문자변환테스트


반응형

댓글()

php 소스에서 오류 메세지 출력하지 않기

프로그래밍/PHP|2020. 6. 3. 13:58
반응형

소스 상단에 아래 코드를 삽입합니다.


error_reporting(0);



반응형

댓글()

Ubuntu 18.04 에 /etc/rc.local 이 안보일 경우

리눅스/OS 일반|2020. 6. 2. 15:59
반응형

우선 아래 경로에 파일이 있는지 확인 합니다.

# ls -al /lib/systemd/system/rc-local.service 

 

파일이 있을 경우, 아래와 같이 파일에 내용 추가 합니다.

echo -e "[Install]\nWantedBy=multi-user.target" >> /lib/systemd/system/rc-local.service

 

스크립트 파일을 생성합니다.

# touch /etc/rc.local

# chmod 755 /etc/rc.local

 

그리고 부팅시 자동 구동 되도록 해주면 됩니다.

# systemctl enable rc-local.service

# systemctl start rc-local.service

 

 

반응형

댓글()

MySQL 데이터 변경 감지 (trigger) + 시스템 명령어 사용 (udf)

리눅스/MySQL|2020. 5. 31. 07:35
반응형

아래는 트리거 예제입니다.

테스트 테이블을 생성합니다.

test 테이블에는 데이터를 넣어 놓고,

test2 테이블에는 구조만 같게 해 놓고 데이터는 넣지 않습니다.

그리고 트리거 설정 후 부터는 test 에 insert 되는 데이터를 test2 에도 insert 되게 합니다.



[테스트 준비]

mysql> use test;


mysql> create table test (no int(3) AUTO_INCREMENT PRIMARY KEY, name varchar(20), age int(3));

mysql> insert test (name, age) values ('CDH', '20');

mysql> insert test (name, age) values ('JJE', '21');


mysql> create table test2 (no int(3) AUTO_INCREMENT PRIMARY KEY, name varchar(20), age int(3));



[트리거 생성]

mysql> delimiter $$

create trigger test_trigger

after insert on test for each row

begin

  insert into test2 values(new.no, new.name, new.age);

end

$$

delimiter ;



[설명]

* test_trigger : 트리거 이름

* after insert : insert 되고 나서 실행 (데이터 처리 전에 실행하려면 before 를 사용)

* on test : test 테이블 연결

* for each row : 각 행마다 실행

* begin ~ end : 조건에 맞으면 begin 과 end 사이 구문 실행 (insert, update, delete 감지 가능)

* new : insert 사용시 new, delete 사용시 old, update 사용시 old, new 를 사용할 수 있습니다.

* delimiter 뒤에 오는 문자로 쿼리 마치는 문자를 정의하는 것입니다.

   내용중에 세미콜론(;) 이 들어갈 수 있으니 $$ 로 변경 해놓고, 모든 작업이 완료 후 다시 ; 로 원복 하였습니다.


[참고]

* 트리거 보기

show triggers;


* 트리거 삭제

drop trigger 트리거명;



[테스트]

데이터를 추가로 입력하여 두 개의 테이블에 들어갔는지 확인합니다.


mysql> insert test (name, age) values ('CJW', '3');

mysql> insert test (name, age) values ('CHY', '5');


mysql> select * from test;

mysql> select * from test2;



[원격지 DB 테이블 연결]

mysql> 쉘 상에서는 직접적인 연결을 지원하지 않고,

내부에 원격지 테이블 연결이 가능하므로 연결을 통하여 insert 를 하면 될 것 같습니다.

(참조 : https://icoon22.tistory.com/251)

(단점 : show table testtbl 시 패스워드 노출)


CREATE TABLE testtbl (

 id INT AUTO_INCREMENT PRIMARY KEY,

 col1 VARCHAR(100) DEFAULT NULL,

 col2 VARCHAR(200) DEFAULT NULL

) ENGINE=FEDERATED 

  DEFAULT CHARSET=UTF8

  CONNECTION='mysql://userid:userpw@192.168.10.2:3306/testdb/testtbl;



[MySQL 에서 시스템 명령어 사용]

MySQL 에서 OS 명령어를 실행하려면 UDF 라이브러리가 필요합니다.


1) 리눅스

centos : https://ymj0078.tistory.com/5

ubuntu : https://oranke.tistory.com/273


(아래는 Ubuntu 18.04 에서 진행하였습니다)


# git clone https://github.com/mysqludf/lib_mysqludf_sys.git

# cd lib_mysqludf_sys/


# vi Makefile

LIBDIR=/usr/lib/mysql/plugin


install:

        gcc -Wall -I/usr/include/mysql -I. -fPIC lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so 

* OS 에 따라 /usr/lib/mysql/plugin 또는 /usr/lib64/mysql/plugin 사용

* /usr/include/mysql 디렉토리가 없는 경우

  Ubuntu : apt -y install libmysqld-dev

  CentOS : yum -y install mysql-devel 패키지 추가 설치


# gcc -shared -o lib_mysqludf_sys.so lib_mysqludf_sys.c -I/usr/include/mysql

# cp -arp lib_mysqludf_sys.so /usr/lib/mysql/plugin/


플러그인 추가 (mysql 로그인 후)

DROP FUNCTION IF EXISTS lib_mysqludf_sys_info;

DROP FUNCTION IF EXISTS sys_get;

DROP FUNCTION IF EXISTS sys_set;

DROP FUNCTION IF EXISTS sys_exec;

DROP FUNCTION IF EXISTS sys_eval;


CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';

CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';

CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';

CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';

CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';


확인

select * from mysql.func;


테스트
select sys_exec('touch /tmp/test_mysql');

동작이 되지 않을 경우 쉘에서 아래와 같이 입력합니다.
(참조 : https://oranke.tistory.com/273)

# apparmor_status
결과에 /usr/sbin/mysqld 를 차단하지 않았나 확인해 볼 것
등록되어있는 경우 삭제를 해야 합니다.

# ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
# apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

재확인
sudo apparmor_status

apparmor 와 mysql 재구동
# systemctl restart mysql
# systemctl restart apparmor

그리고 다시 테스트
select sys_exec('touch /tmp/test_mysql');

그렇다면 MySQL trigger 와 udf 를 합친 방법을 사용해 봅시다.

맨 위의 예제에서 begin 과 end 사이에 아래 내용을 넣으면..

begin
    SET @exec_var = sys_exec(CONCAT('touch /tmp/', new.name));
end

exec_var 라는 mysql 변수에 sys_exec 결과를 넣는다는 뜻이지만 실제로 실행이 되어집니다.
CONCAT() 에 있는 'touch /tmp/' 와 콤마(,) 뒤의 new.name (새로운 name 필드값) 은 아래와 같이 이어붙인 명령이 됩니다.

insert into test (name, age) values ('cdh', '22'); 라고 입력시
=> touch /tmp/cdh 라고 시스템 명령을 수행한 것과 같습니다.

한 번 더 해보면.. (CONCAT 내의 띄어쓰기 잘 살펴볼 것)

begin
  SET @exec_var = sys_exec(CONCAT('touch /tmp/', new.name, ' /tmp/', new.age));
end

insert into test (name, age) values ('cdh', '22'); 라고 입력시
=> touch /tmp/cdh /tmp/22 라고 시스템 명령을 수행한 것과 같습니다.
    그래서 /tmp 디렉토리 내에 cdh 와 22 라는 파일이 생성된 것을 볼 수 있습니다.


2) 윈도우


아래 URL 은 64bit 용 dll 파일 입니다.

https://github.com/sqlmapproject/sqlmap/files/1789515/lib_mysqludf_sys_64.zip


lib_mysqludf_sys_64.zip

{mysql 설치디렉토리}\lib\plugin 안에 저장합니다.


디렉토리가 보이지 않을 경우 아래와 같이 플러그인 경로를 확인하고 실제로 존재하지 않을 경우

디렉토리를 수동으로 생성해줍니다.


mysql> select @@plugin_dir;


라이브러리 추가


mysql> use mysql;

mysql> create function sys_exec returns int soname 'lib_mysqludf_sys.so';


확인


mysql> selet * from mysql.func;


시스템 명령어 사용 예 (리눅스와 동일. 단 경로는 슬래시 두개로 사용)


1) 그냥 사용시

mysql> select sys_exec("echo aaa > c://test.txt");


반응형

댓글()