카테고리 보관물: .Net / C#

파워쉘(PowerShell) 을 이용한 ASP.NET 프로그램 작업 스케줄러 등록

개요

특정프로그램을 주기적으로 실행해야하는 경우가 있습니다. 배치 프로그램이 대표적입니다. 서비스 프로그램으로 만들거나 실행 프로그램으로 제작하여 작업 스케줄러에 추가해서 주기적으로 실행하게 됩니다. ASP.NET을 기반으로 하는 프로젝트 작업 시 실행 프로그램으로 따로 제작하기 애매한 경우가 있습니다. 이런 경우 ASP.NET 프로그램을 파워쉘(PowerShell) 을 이용해서 주기적으로 실행되도록 할 수 있습니다.

파워쉘(PowerShell)

기본적으로 작업 스케줄러에 ASP.NET 프로그램을 실행하도록 설정할 수 있습니다.

작업 스케줄러 ASP.NET 실행 설정

작업 스케줄러 ASP.NET 실행 설정

위의 이미지와 같이 “C:\Program Files\internet explorer\iexplore.exe” http://localhost/do.aspx 이런식으로 프로그램/스크립트 항목을 설정하면 됩니다. 이 경우 주기적으로 실행은 되지만 시간이 지나고 서버에 접속해보면 브라우저가 여러개 실행되어 있는 것을 알 수 있습니다. 실행 후 브라우저가 자동으로 종료되면 좋은데 그렇지가 않습니다.

이런경우 파워쉘(PowerShell) 스크립트를 작성하고 배치파일로 감싼 것을 실행하도록 하면 ASP.NET 프로그램을 브라우저로 실행시킬 수 있고 브라우저가 실행된 채로 남아있는 문제를 해결할 수 있습니다.

파워쉘(PowerShell) 스크립트 작성

파워쉘(PowerShell) 스크립트를 다음과 같이 작성합니다.

$request = [System.Net.WebRequest]::Create("http://localhost/do_something.aspx")
$response = $request.GetResponse()
$response.Close()

Create(…) 부분에 실행할 ASP.NET 프로그램의 주소를 입력하면 됩니다. 그 다음 작성된 스크립트를 실행하는 배치파일을 다음과 같이 작성합니다.

@echo off
Powershell.exe -noprofile -executionpolicy bypass -file "your powershell script path\do_something<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span>.ps1"

스케줄추가

배치파일이 작성되었으면 작업 스케줄러에서 실행 프로그램으로 지정해 주면 됩니다.

작성된 배치파일 지정

작성된 배치파일 지정

이렇게 하면 ASP.NET 프로그램이 주기적으로 실행되면서 브라우저도 실행된 상태로 남아있는 문제점이 사라지게 됩니다.

파워쉘(PowerShell) 스크립트를 이용한 ASP.NET 프로그램을 주기적으로 실행하는 방법을 알아보았습니다.

Html Agility Pack 을 사용한 html 파일 파싱(parsing)

개요

프로젝트를 진행하다 보면 html 파일의 내용 일부를 가져와야 하는 경우가 있습니다. html 파일의 형식이 항상 동일하고 가져와야 하는 값이 고정되어 있다면 큰 문제가 되지 않습니다. 태그를 모두 제거한 후 처리하거나 파일 전체를 문자열로 취급하여 원하는 부분을 가져옵니다. 문제는 파일의 내용이 일정하지 않고 많은 값을 가져올 때 입니다. 태그를 제거하거나 문자열로 취급해서 찾기에는 너무 복잡하고 어렵습니다. 내용에 조금의 변화면 있어도 오류가 발생할 소지가 매우 높습니다. 이런 경우 Html Agility Pack 을 사용하면 쉽게 원하는 요소의 값을 가져올 수 있습니다.

Html Agility Pack

Html Agility Pack (HAP) 은 html 파서(Parser)입니다. 파일, 문자열, URL 로 부터 html 형식을 읽어들여 요소에 대한 값을 취하거나 변경할 수 있습니다. 설치는 비주얼 스튜디오 패키지 관리자 콘솔에서 다음과 같이 입력하면 됩니다.

PM>Install-Package HtmlAgilityPack -Version 1.6.15

설치 후 다음과 같이 읽어 들인 후 파싱하여 원하는 요소의 값을 가져오면 됩니다.

파싱(Parsing)

대부분 SelectNodes(), SelectSingleNode(String) 메소드를 이용해서 값을 가져오게 됩니다.

다음은 파싱 대상 html 파일 입니다.

<body>
<div>
<div>
<div>
<strong><span id="HomeDeviceName">Laser Printer</span></strong>
<strong>192.168.1.120<span id="deviceIp" /></strong>
</div>
</div>
<div>
<h1>페이지</h1>
<div>
<div class="consumable-block-header">
<h2 id="black">black</h2>
<p class="percentage">0%*</p>
<p class="data"><span>ABCDEFG</span></p>
<div class="color" style="border: solid 1px black">
<strong class="2" id="level">2%</strong>
</div>
</div>
<p><span>상태</span><strong id="status">알수없음</strong></p>
<p><span>남은 페이지</span><strong id="remainPage">1000</strong></p>
<p><span>일련 번호</span><strong id="serialNumber">123456789</strong></p>
<p><span>인쇄한 페이지 수</span><strong id="printCount">1234</strong></p>
</div>
</div>
</div>
</body>

각 요소를 가져오는 코드를 보겠습니다.

var suppliesPage = new HtmlAgilityPack.HtmlDocument();
suppliesPage.Load(suppliesPageFilePath, Encoding.UTF8);

var data = suppliesPage.DocumentNode.SelectNodes("//div[@class='consumable-block-header']")[0].SelectNodes("p[@class='data']//span").First().InnerHtml.Trim(); //ABCDEFG
var status = suppliesPage.DocumentNode.SelectNodes("//strong[@id='status']").First().InnerHtml.Trim(); //알수없음
var remainPage = suppliesPage.DocumentNode.SelectNodes("//strong[@id='remainPage']").First().InnerHtml.Trim(); //1000
var serialNumber = suppliesPage.DocumentNode.SelectNodes("//strong[@id='serialNumber']").First().InnerHtml.Trim(); //123456789
var printCount = suppliesPage.DocumentNode.SelectNodes("//strong[@id='printCount']").First().InnerHtml.Trim(); //1234

요소의 id 및 class로 값을 가져올 수 있습니다.

xpath 형식으로 기술하여 원하는 요소의 값을 가져올 수 있습니다

이상으로 Html Agility Pack 을 이용하여 html 파일을 파싱하는 방법을 알아봤습니다.