PowerShell, CMD

728x90
반응형

들어가며

많은 환경의 PC 및 서버들을 관리할 일이 생기다보니, 부쩍 커맨드(CMD)와 파워쉘을 접하게 되는 경우가 늘어났습니다.

자동 배포를 이용해서 실행시킬 수도 있으며, 원격으로 관리되는 항목에서도 유용하게 사용이 되고 있습니다.

프로그램을 윈도우 서비스로 등록해서 사용하는 경우가 많지는 않지만, 

알아두면 좋을거 같아서 정리합니다. 

 

 


 

 

윈도우 서비스 등록 방법

윈도우 서비스를 등록하기 전에 .NET Framework 가 설치되어 있는 지 확인한다.

요즘 윈도우는 설치되어 있을것으로 생각이 되지만, 그래도 모르니 확인하는게 좋습니다.

위치는 아래와 같습니다.

C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319

 

 

 

해당 위치에 있는 InstallUtil.exe 파일을 이용해서 서비스에 등록할 수 있습니다.

아래에 해당하는 내용을 CMD 창에 한땀 한땀 입력해도 되고, bat 파일로 만들어서 실행해도 좋습니다.

bat 파일로 만드는것은 생략하겠습니다.

C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\InstallUtil C:\\Test\\TestApp.exe
sc config TestApp start=delayed-auto
sc failure TestApp actions= restart/60000 reset= INFINITE
sc failureflag TestApp 1
sc start TestApp

 

 

 

윈도우 서비스 해제 방법

C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\InstallUtil /u C:\\Test\\TestApp.exe

위와 같이 등록된  윈도우 서비스를 해제할때는, /u 옵션을 이용해서 해제를 할 수 있습니다. 

 

 

 

 

윈도우 서비스 등록 확인 방법

검색 창에 서비스를 입력하면, 톱니바퀴 모양의 서비스 앱이 보이며, 해당 앱을 실행합니다.

 

 

 

 

 

그러면 위와 같이 윈도우 서비스로 등록된 프로그램 목록이 보여지며, 

등록하신 윈도우 서비스를 확인하시면 됩니다.

 

 

 

 

 

 

 

 

 

728x90
728x90
반응형

들어가기전

command 창을 주로 사용하긴 하지만, 간혹 의도적으로 다양한 기능이 있는 PowerShell 을 사용하려고 하고있습니다.

그러던 중, Consolas 폰트를 좋아하는 저로써, Font 변경을 위해 다양한 시도를 해보았는데요.

윈도우 설치시 기본으로 제공되고 있는 PowerShell 에는 Consolas 폰트를 지원하지 않았습니다.

 

검색도중 PowerShell 을 상위 버전을 설치하면, Font를 지원한다는 글을 보고, 현 시점의 최신버전인 PowerShell 7.2.1 버전을 설치 하기로 했습니다. 

 

 

 

PowerShell 다운로드

파워쉘은 아래의 github 주소에서 다운로드 받을 수 있습니다.

 

https://github.com/PowerShell/PowerShell/releases/tag/v7.2.1

 

Release v7.2.1 Release of PowerShell · PowerShell/PowerShell

7.2.1 - 2021-12-14 General Cmdlet Updates and Fixes Remove declaration of experimental features in Utility module manifest as they are stable (#16460) Bring back pwsh.exe for framework dependent p...

github.com

 

 

2021년 12월 14일 자로 PowerShell 7.2.1 버전이 Release 되어 있었습니다. 

Font 사용이 목적이였기 때문에 수정 및 추가된 사항에 대해서는 따로 확인 하지 않았습니다. 

 

 

 

 

 

저는 현재 Windows 10 x64 비트를 사용중이기 때문에, 해당 버전에 맞는 msi 설치 파일을 다운로드 받아서 설치 하였습니다.

 

 

 

 

PowerShell 설치

설치의 방법은 크게 어려움이 있는 것은 아니며, 순차적으로 내용을 확인하면서, 넘어가시면 됩니다. 

 

 

해당 부분에서는 Add 'Open here' context menus to Explorer 을 선택해주었습니다.

해당 기능은 폴더 탐색창에서 Shift 버튼을 클릭한 채로 우측 마우스 버튼을 클릭하면, 

이와 같이 현재 폴더위치에서 PowerShell 을 열 수 있도록 추가해주는 기능이여서, 선택했습니다.

엄청 편합니다.

 

 

 

이와 같이 설치를 완료하면, PowerShell 을 바로 실행 할 수 있습니다.

근데, 기본적으로 설치되어 있는 PowerShell의 화면이 아닌, 검정 화면이네요.

순간 어색했습니다.

 

 

 

 

 

Font 및 배경색상 설정

일단 배경색이 검정이여서, PowerShell을 사용하는 느낌이 들지 않아, 배경색을 변경해주었습니다.

기본적으로 색상이 프리셋되어 있지 않아서, RGB 색상을 숫자값으로 기입해 주었습니다.

R : 1, G : 36, B : 86

 

 

그리고 원래 목적이였던 Font를 Consolas 로 변경 해주었습니다.

 

 

완성 되었네요. 

확인 버튼을 누르면, 위와 같이 Font 가 적용된 PowerShell을 보실 수 있습니다.

 

하지만, 기본적인 기능에서만 해당 Font 가 적용되고, 터미널을 실행한다거나, 특정 기능을 실행했을때는 다시 예전처럼 Font가 일시적으로 적용이 안되더군요 ^^

그래도 만족합니다.

 

 

 

 

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받고 있습니다.

 

 

 

 

 

 

 

 

 

 

 

728x90
728x90
반응형

 

Jenkins를 사용하다보면, cmd 및 batch script 를 이용해서 여러가지 프로세스를 제어하는 방법을 사용합니다. 

그중에 가장 많이 사용하는 것중에 하나가, 프로세스를 실행하고 죽이능 script가 아닐까 싶은데요.

물론 개인적인 의견입니다.

 

비교적 batch script 작성이 쉬운 것중에 하나가 taskkill 명령어를 이용해서 프로세스를 정지하는 것인데요.

그냥 taskkill만 사용하다 보면, 프로세스가 의도치 않게 정지된 경우, 젠킨스(Jenkins)에서 오류로 인식하는 경우가 발생합니다. 이를 해결하기 위해서 tasklist 명령어를 이용해서 사용하는 방법을 정리 하였습니다. 


 

 

 

방법 1

@echo on

tasklist /fi "imagename eq notepad.exe" |find ":" > nul
if errorlevel 1 taskkill /f /im "notepad.exe"

EXIT /B 0

 

 

방법 2

@echo off
tasklist /fi "imagename eq notepad.exe" | find /i "notepad.exe" > nul
if not errorlevel 1 (taskkill /f /im "notepad.exe") else ( echo not working process )
exit

 

 

방법 3

tasklist | find /i "notepad.exe" && taskkill /im notepad.exe /F || echo process "notepad.exe" not running.

 

 

방법 4

@echo off
set run=
tasklist /fi "imagename eq notepad.exe" | find ":" > nul
if errorlevel 1 set run=yes
if "%run%"=="yes" echo notepad is running
if "%run%"=="" echo notepad is not running
pause

 

 

 

 

참고

https://stackoverflow.com/questions/15449034/batch-program-to-to-check-if-process-exists

 

728x90
728x90
반응형

 

 

프로젝트를 진행함에 있어서, 각 구성원들간에 정보를 공유해야 할 사항이 많이 발생하는 있어서, 각 구성원들간에 정보를 공유해야 할 사항이 많이 발생합니다. 이를 조금이나마 효율적으로 하기 위해서 별도의 서버를 구성해서

각 구성원들에게 메신저API를 통해서 알람이 발송되도록 진행을 했는데요.

 

이때 PowerShell 을 이용해서 웹 RESTFul API 를 호출 했습니다. 

Curl을 이용해도되지만, Jenkins 가 Windows 서버에 설치가 되어 있어서 PowerShell 을 이용했습니다. 

 


 

Invoke-WebRequest

웹 RESTFul API의 호출은 PowerShell 의 Invoke-WebRequst 명령어를 이용해서 진행했습니다.

주로 사용하는 Method Type이 GET 과 POST 방식이 있을 텐데요. 

각각 호출 하는 방식에 대해서 정리해보겠습니다.

 

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7.1 

 

Invoke-WebRequest (Microsoft.PowerShell.Utility) - PowerShell

The Invoke-WebRequest cmdlet sends HTTP and HTTPS requests to a web page or web service. It parses the response and returns collections of links, images, and other significant HTML elements. This cmdlet was introduced in PowerShell 3.0. Beginning in PowerS

docs.microsoft.com


 

GET 방식

GET 방식은 모든 Param 의 정보가 URL에 포함되어 있는 구조이다 보니, 

호출하는 방식이 간편합니다.

Invoke-WebRequest "http://localhost:8888/api/Send?param1=PARAM1&param2=PARAM2"

Invoke-WebRequest -Method GET -Uri http://localhost:8888/api/Send?param1=PARAM1&param2=PARAM2

 


 

POST 방식

사실 포스팅의 목적은 POST 방식을 정리하기 위함이였습니다. 

POST 방식은 Body 부분에 데이터를 포함해서 전달하는 방식이기 때문에 ContentType 에 대해서 추가적인 설정이 필요한데요.

또한 PowerShell 을 이용하다 보면, 한글이 깨지는 현상도 같이 발생해서, 

이를 포함해서 정리했습니다. 

$text="param1=PARAM1&param2=PARAM2"
$postParam=[System.Text.Encoding]::UTF8.GetBytes($text)

Invoke-WebRequest -Method POST -Body $postParam -ContentType "application/x-www-form-urlencoded; charset=utf-8" -Uri http://localhost:8888/api/Send

 

ContentType은 저의 경우 Form 방식을 이용했기 때문에 application/x-www-form-urlencoded 를 이용했습니다.

JSON 방식이라면 application/json 으로 보내시면 됩니다.

 

 

 

 

 

 

 

 

 

728x90
728x90
반응형

파워쉘을 사용하다 보면은, 아래와 같은 오류를 보시는 경우가 발생합니다. 

PowerShell의 경우 기본적으로 ps1 확장자 파일을 실행하지 못하도록 되어 있습니다.

이는, 해당 정책이 Restricted 로 되어 있기 때문인데요. 

 

 

 

이는 아래의 명령어를 통해서 실행 권한을 변경 할 수 있습니다. 

PS > Set-ExecutionPolicy RemoteSigned

 

또한 현재 상태를 확인하기 위해서는 아래의 명령어를 이용하면, 현재 상태를 확인 할 수 있습니다. 

PS > Get-ExecutionPolicy

 

 

 

 

Restricted (제한된) 파워쉘의 실행 권한 정책 기본 옵션(기본적으로 적용되어 있음), 명령어 하나씩 실행 가능.
.ps1 스크립트 파일을 로드하여 실행할 수 없습니다.
AllSigned 오직 신뢰된 배포자에 의해 서명된 스크립트만 실행할 수 있습니다.
RemoteSigned 로컬 컴퓨터에서 본인이 생성한 스크립트만 실행 가능, 인터넷에서 다운로드받은 스크립트는 신뢰된 배포자에 의해 서명된 것만 실행할 수 있습니다.
Unrestricted (무제한) 제한없이 모든 스크립트를 실행할 수 있습니다.
ByPass 어떤 것도 차단하지 않고 경고없이 실행할 수 있습니다.
Undefined 정책 적용 않함, 기본 실행 권한 정책 적용됩니다. (Restricted)

 


참고

https://blog.naver.com/bluesketch21/221383264763

https://cloudsns.wordpress.com/2012/07/04/set-executionpolicy%EC%9D%98-remotesigned%EC%9D%98-%EC%9D%98%EB%AF%B8/

 

 

 

 


 

728x90
728x90
반응형

 

업무의 자동화를 위해서, 각 개발자들이 commit 한 내용에 대해서, 알림 형태로 전달해주는 기능을 만들어 보려고 했습니다.

이를 달성하기 위해서는 SVN에서 사용하는 히스토리를 CI 툴을 이용해서 지속적으로 체크를 했어야 했습니다.

이 과정에서 주요핵심은 SVN에서 제공하는 로그를 이용해서 전달 가능한 형태로 가공하는 것이 주요 과제 였습니다. 

 

수차례에 걸쳐서 구글링도 해봤고, SVN에 옵션이 있는지 체크도 했었지만, 마음에 드는 형태를 발견하지는 못했습니다.

필자가 원하는 로그의 형태는 아래와 같았습니다.

두개 중에서 가독성이 좋은 방식을 선택하려고 했습니다. 

1. 계정 - 커밋 메시지 [리비전번호]

2. 계정 [리비전번호] - 커밋메시지

 

과정

첫번째로는 svn 에서 제공하는 것이 있는지 확인했습니다만, 존재 하지 않았습니다. git과는 다르더군요.

두번째로는 텍스트 가공에 이점이 많다는 perl을 이용해봤습니다. 구글링 과정에서도 몇가지 발견을 했지만..

결론적으로는 " | " 이 문구를 파싱하지 못했습니다. 아직 원인을 발견하지 못했는데요. 이유를 아시는 분은 댓글로라도 남겨주시면 감사하겠습니다. 

 

세번째로 선택한 방법이 파워쉘이였습니다. 

svn 에서는 xml 형태로 로그 포멧을 변경해주는 기능이 존재해서 이를 이용해서 가공하였습니다. 

PS> svn log -r BASE:HEAD --xml

 

 

코드

[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$env:LC_ALL='C.UTF-8'

[xml]$XMLDATA = svn log -r BASE:HEAD --xml

$node= $XMLDATA.selectnodes("//logentry")
for ($i=1;$i -lt $node.count; $i++){
    $text += $XMLDATA.log.logentry.author[$i] + " [" +$XMLDATA.log.logentry.revision[$i] + "]" + " - " + $XMLDATA.log.logentry.msg[$i] + "`n"
}

$text

앞에 [xml] 이라는 형태로 지정을 해주고, 

코드에 나와있는 형태로 xml dom 구조에 바로 접근해서 데이터를 가져올 수 있습니다. 

저의 경우는 logentry 의 개수를 가져오기 위해서 별도로 $node 변수에 노드를 담아 두었고요.

$node.count 를 이용하시면, 몇개의 node가 있는지 확인 할 수 있어서, 반복문을 돌릴때도 유용합니다.

 

결과물은 아래와 같으며, 주요한 내용은 가림처리 하였습니다.

두번째 안이 보기에 나은거 같아서 이와같치 포맷을 맞췄습니다. 

 

 

이렇게 생성된 Log 텍스트 포맷은, 팀원들에게 공유차원에서 어떠한 커밋이 발생했는지를 지속적으로 알려주고, 

공유해주는 역활로 사용중입니다.

 

 

 


 

728x90

+ Recent posts