관리자 권한으로 PowerShell을 실행하고 아래 스크립트를 실행한다.

 
$unitFactor = 1MB
$unitLabel = "MB"
Get-ChildItem . -Directory | ForEach-Object {
    $folderPath = $_.FullName
    $folderSize = (Get-ChildItem -Path $folderPath -Recurse -File | Measure-Object -Property Length -Sum).Sum
    [PSCustomObject]@{
        FolderName = $_.Name
        FolderSize = [Math]::Round($folderSize / $unitFactor, 2)
        Unit = $unitLabel
    }
} | Sort-Object FolderSize -Descending | Format-Table -AutoSize

아래와 같이 결과가 나온다.

 
FolderName          FolderSize Unit
----------          ---------- ----
Windows               43176.91 MB
Program Files         33170.97 MB
Program Files (x86)   26081.94 MB
Users                 26030.42 MB
chrometemp              176.09 MB
Python27                 66.21 MB
Temp                       0.7 MB
PerfLogs                     0 MB
inetpub                      0 MB

메뉴 > 도구 > 옵션

"키보드" 입력 후 자세한 설정 > 키보드 누른다.

 

 

1. 오른쪽 탭을 만들어 문서 이동

"창.새탭그룹오른쪽"을 선택하고 "바로 가기 키 누르기(P)"에 Ctrl+Alt+V 키를 누르고 할당 버튼을 누른다.

 

 

2. 현재 커서 단어 선택

"창.닫기" 명령을 선택하고 선택한 명령의 바로가기에서 Ctrl+W 를 선택하고 제거 버튼을 누른다.

 

"편집.현재단어선택"을 선택하고 "바로 가기 키 누르기(P)"에 Ctrl+W 키를 누르고 할당 버튼을 누른다.

 

3. 보기 100% 단축키

"View.ZoomReset"을 선택하고 "바로 가기 키 누르기(P)"에 Ctrl+0,0 키를 누르고 할당 버튼을 누른다.

 

 

https://learn.microsoft.com/ko-kr/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-9.0&tabs=visual-studio

 

Windows 서비스에서 ASP.NET Core 호스트

Windows 서비스에서 ASP.NET Core 앱을 호스트하는 방법을 알아봅니다.

learn.microsoft.com

Windows 서비스에서 ASP.NET Core 호스트 페이지 참고

 

프로젝트 생성

dotnet new worker -o ContosoWorker

 

Worker.cs

namespace ContosoWorker;

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    private readonly string _logFile;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
        _logFile = Path.Combine(Path.GetTempPath(), "ContosoWorker.log");
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        await LogAndWriteAsync("Worker is starting.", stoppingToken);

        while (!stoppingToken.IsCancellationRequested)
        {
            var timestamp = DateTimeOffset.Now;
            await LogAndWriteAsync($"Worker running at: {timestamp}", stoppingToken);
            await Task.Delay(5000, stoppingToken);
        }
    }

    private async Task LogAndWriteAsync(string message, CancellationToken cancellationToken)
    {
        _logger.LogInformation(message);
        await File.AppendAllTextAsync(_logFile, message + Environment.NewLine, cancellationToken);
    }
}

Program.cs

using ContosoWorker;

var builder = Host.CreateApplicationBuilder(args);

// Windows Service 등록 (중요)
builder.Services.AddWindowsService(options =>
{
    options.ServiceName = "Contoso Worker";
});

builder.Services.AddHostedService<Worker>();

var host = builder.Build();
host.Run();

 

빌드

dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true

 

관리자 권한으로 서비스 생성

sc.exe create ContosoWorker binPath="D:\Learn\c#\ContosoWorker\bin\Release\net9.0\win-x64\publish\ContosoWorker.exe"

 

서비스 시작

Start-Service -Name ContosoWorker

 

로그확인 : C:\Windows\SystemTemp\ContosoWorker.log

Worker is starting.
Worker running at: 2025-09-15 오후 3:05:50 +09:00
Worker running at: 2025-09-15 오후 3:05:55 +09:00
Worker running at: 2025-09-15 오후 3:06:00 +09:00
Worker running at: 2025-09-15 오후 3:06:05 +09:00
Worker running at: 2025-09-15 오후 3:06:10 +09:00
Worker running at: 2025-09-15 오후 3:06:15 +09:00
Worker running at: 2025-09-15 오후 3:06:20 +09:00
Worker running at: 2025-09-15 오후 3:06:25 +09:00
Worker running at: 2025-09-15 오후 3:06:30 +09:00
Worker running at: 2025-09-15 오후 3:06:35 +09:00
Worker running at: 2025-09-15 오후 3:06:40 +09:00
Worker running at: 2025-09-15 오후 3:06:45 +09:00
Worker running at: 2025-09-15 오후 3:06:51 +09:00
Worker running at: 2025-09-15 오후 3:06:56 +09:00

 

윈도우 이벤트에는 기록되지 않는다.

 

참고 서비스 삭제

$serviceName = "ContosoWorker"
Stop-Service -Name $serviceName -Force -ErrorAction SilentlyContinue
sc.exe delete $serviceName

# 레지스트리 확인 및 강제 삭제
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\$serviceName"
if (Test-Path $regPath) {
    Remove-Item -Path $regPath -Recurse -Force
}

 

+ Recent posts