유용한 코드(batch) 1
bkini.ini 안의 많은 설정값 중
UpdateSpeedCore=8 을 UpdateSpeedCore=5 로
바꾸고 new.ini 파일로 내용을 저장하는 코드
@echo off
set TARGET=UpdateSpeedCore
set VALUE=5
(for /f "tokens=1,* delims=]" %%a in ('type bkini.ini ^| find /n /v ""') do (
if "%%b" == "" (
echo.
) ELSE (
FOR /F "tokens=1,* delims==" %%k in ("%%b") DO (
IF %%k==%TARGET% (
echo %TARGET%=%VALUE%
) ELSE (
echo %%b
)
)
)
))>"new.ini"
※ 해설
@echo off
-> cmd 화면에 명령 복창을 하지 않게 함, @는 이 명령 자체도 복창하지 않게
set TARGET=UpdateSpeedCore
-> 변수 선언과 값 대입, 사용시 %TARGET% 으로 사용
for /f "tokens=1,* delims=]" %%a in ('type bkini.ini ^| find /n /v ""') do (
-> 분할설명
for /f "options" %%var in ('command_to_process') do ( .....
-> for 문 options 설명 이전에 command_to_process 부분 설명
bkini.ini 파일의 내용을 한 줄 씩 긁어 온다. 그런데
find /v /n "" 라는 조건이 달려있다.
이는 각 라인에 [number] 형태의 라인넘버를 붙여서 긁어오고(/n)
공백 문자를 포함하지 않는 라인만 추려서 가져온다는 것(/v "")
예시> 이런 내용의 ini 파일이 있다면, for 문 단계에서는
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[/Script/EngineSettings.GeneralProjectSettings]
ProjectID=2F40BC8E489521C36FE7B99E98610C40
[StartupActions]
bAddPacks=True
InsertPack=(PackSource="StarterContent.upack",PackName="StarterContent")
UpdateSpeedCore1=100
UpdateSpeedCore=88
odbcDSN=QGMGTMS_62
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
이 상태에서
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[1][/Script/EngineSettings.GeneralProjectSettings]
[2]ProjectID=2F40BC8E489521C36FE7B99E98610C40
[3]
[4][StartupActions]
[5]bAddPacks=True
[6]InsertPack=(PackSource="StarterContent.upack",PackName="StarterContent")
[7]
[8]UpdateSpeedCore1=100
[9]UpdateSpeedCore=88
[10]
[11]
[12]odbcDSN=QGMGTMS_62
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
이렇게 나옵니다.
이렇게 넘버를 붙여서 정보를 가공하는 이유는
-> 공백 라인까지도 그대로 유지하는 결과물을 뽑아내기 위함입니다.
그리고 options 설명
저렇게 가져와 진 내용을 가공하여 취사 선택하는 부분입니다.
delims=] 이 부분은 각 라인을 ] 를 기준으로 나눕니다.
나누는 개수는 tokens=1,* 를 보면 첫 ] 의 앞쪽은 %%a 에 나머지 뒤쪽은 %%b 에
이렇게 두부분으로 저장합니다.
언급되지 않은 %%b 는 암묵적으로 생겨나는 거라고 생각 하세요
우리는 %%b 에 집중합니다. 원래 ini 파일에 있던 내용들입니다.
if "%%b" == "" (
echo.
) ELSE (
)
%%b 가 empty 라인이면 빈줄을 생성(echo.) 합니다.
아니라면 아래와 같이
FOR /F "tokens=1,* delims==" %%k in ("%%b") DO (
IF %%k==%TARGET% (
echo %TARGET%=%VALUE%
) ELSE (
echo %%b
)
)
%%b 의 내용을 이번엔 = 을 기준으로 앞뒤로 나누어서 앞 부분인 %%k를 이용합니다.
%%k 의 내용이 %TARGET%과 같아면 %TARGET%=%VALUE% 형태로 만들어 주고
아닌경우 그대로의 내용 %%b 을 기입한다.
(로직)>"new.ini"
-> 해당 로직을 거쳐 나온 내용을 new.ini 에 생성한다.
-----------------------------------------------------------------------------------------
@는 echo를 하지 말라는 것
echo off 는 앞으로 echo 끄라는 명령어
echo ㅇㅇㅇㅇㅇ 라고 하면 ㅇㅇㅇㅇㅇ 가 프린트 됨
echo < 는 프린트 안됨 ^ 를 앞에 (^< 이렇게) 붙이면 < 가 출력됨
/? 출력을 하려면
ehco./? 이렇게 하면됨
윈도우 명령어
----------------------------------------------------------------------------------------
ss64.com
관련 사이트
----------------------------------------------------------------------------------------
FOR 문 사용법
FOR /F ["options"] %%parameter IN (filenameset) DO command
FOR /F ["options"] %%parameter IN ("Text string to process") DO command
ex)
FOR /F "tokens=1,2 delims=\=" %%K IN (bkini.ini) DO (
IF "%%K" NEQ "UpdateSpeedCore" (
>>bkini.new echo %%K=%%L
) else (
>>bkini.new echo %%K=8
)
)
#FOR 문은 한 라인씩 인식 따온다.
options 설명
tokens= 라인에서 몇 번째 문자열을 가져올지
tokens=2,4,6
tokens=2-6
tokens=*
tokens=3* will process the third token and the 4th + all subsequent items, this can also be written as tokens=3,*
delims= 어떤 문자로 문자열을 나눌지(기본은 공백문자)
skip= 몇 번째 라인까지 스킵할지
eol= 기본값 ; 주석 ("eol=" 기능 끄기, "eol=# eol=@" -> 의 경우 마지막 것 적용 )
usebackq 인용부호" 관련 플래그
이 옵션은 공백을 포함한 파일 경로 양쪽에 큰 따옴표를 붙여줄 때 사용합니다.
대신 이 옵 션을 사용하면 괄호안에 들어갈 집합에 대한 표시를 조금 다르게 해야합니다.
원래는 (파일), ("문자열"), ('명령어') 인데 usebackq 옵션을 사용하면
("파일"), ('문자열'), (`명령어`) 형태로 써야합니다.
parameter 는 배치파일 에서는 %%p, 커맨드 라인에서는 %p, 추가로 대소문자 구분
----------------------------------------------------------------------------------------
레지스트리 내용 확인
커맨드라인에 reg.exe query hklm 라고 치면

내 피씨의 레지스트리 정보 중 HKEY_LOCAL_MACHINE 아래 항목이 나온다