Windows에서 날짜별 폴더를 자동 생성하는 방법
Windows에서 PowerShell로 날짜별 폴더를 자동 생성하는 방법입니다. Get-Date, New-Item, 월/일 계층 구조, 배치 래퍼, 작업 스케줄러 등록을 정리했습니다.
Windows에서 날짜별 폴더를 만들 때는 지역/언어 설정에 따라 %date% 문자열 위치가 달라질 수 있습니다. 그래서 새 스크립트는 PowerShell의 Get-Date -Format을 사용하는 편이 더 안정적입니다.
백업, 로그 수집, 일일 리포트처럼 매일 실행되는 작업은 같은 규칙의 폴더명을 써야 추후 자동 정리와 검색이 쉬워집니다. 예시는 yyyy_MM_dd 기준이지만, 운영 표준이 있다면 yyyy-MM-dd처럼 통일해서 사용합니다.
PowerShell 방식
$BasePath = "C:\Logs"
$FolderName = Get-Date -Format "yyyy_MM_dd"
$TargetPath = Join-Path $BasePath $FolderName
New-Item -ItemType Directory -Path $TargetPath -Force | Out-Null
Write-Host "created: $TargetPath"
파일로 저장하려면 Create-DateFolder.ps1처럼 저장합니다.
powershell.exe -ExecutionPolicy Bypass -File .\Create-DateFolder.ps1
재사용 가능한 스크립트
경로를 코드에 박아두면 서버마다 수정해야 하므로, 매개변수로 받도록 만들면 더 오래 쓸 수 있습니다.
param(
[string]$BasePath = "C:\Logs",
[string]$DateFormat = "yyyy_MM_dd",
[int]$OffsetDays = 0
)
$FolderName = (Get-Date).AddDays($OffsetDays).ToString($DateFormat)
$TargetPath = Join-Path $BasePath $FolderName
if (-not (Test-Path -Path $BasePath)) {
New-Item -ItemType Directory -Path $BasePath -Force | Out-Null
}
New-Item -ItemType Directory -Path $TargetPath -Force | Out-Null
Write-Output $TargetPath
powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\Create-DateFolder.ps1 -BasePath D:\Backup -OffsetDays -1
어제/내일 날짜 폴더
# 어제
$FolderName = (Get-Date).AddDays(-1).ToString("yyyy_MM_dd")
# 내일
$FolderName = (Get-Date).AddDays(1).ToString("yyyy_MM_dd")
월별/일별 계층 구조
$BasePath = "D:\Backup"
$YearMonth = Get-Date -Format "yyyy_MM"
$Day = Get-Date -Format "dd"
$TargetPath = Join-Path (Join-Path $BasePath $YearMonth) $Day
New-Item -ItemType Directory -Path $TargetPath -Force | Out-Null
월별 폴더 아래 날짜 폴더를 두면 백업 보관 주기나 압축 정책을 월 단위로 적용하기 쉽습니다.
배치 파일 방식
간단한 환경에서는 batch도 사용할 수 있지만, %date% 문자열이 한국어/영어/도메인 정책에 따라 달라질 수 있습니다.
@echo off
for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyy_MM_dd"') do set FOLDER_NAME=%%i
mkdir "%FOLDER_NAME%" 2>nul
echo created: %FOLDER_NAME%
작업 스케줄러 등록
매일 새벽 1시에 실행하려면 작업 스케줄러에서 프로그램을 powershell.exe로 두고 인수를 다음처럼 지정합니다.
-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\Create-DateFolder.ps1"
명령으로 등록할 수도 있습니다.
schtasks /Create /TN "Create Daily Folder" /SC DAILY /ST 01:00 ^
/TR "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\Create-DateFolder.ps1 -BasePath D:\Backup" ^
/F
schtasks /Query /TN "Create Daily Folder" /V /FO LIST
schtasks /Run /TN "Create Daily Folder"
실행 로그 남기기
예약 작업은 실패해도 눈에 잘 띄지 않습니다. 간단히 로그 파일을 남기면 나중에 원인 확인이 쉽습니다.
$LogPath = "C:\Scripts\Create-DateFolder.log"
"$(Get-Date -Format s) created $TargetPath" | Out-File -FilePath $LogPath -Append -Encoding utf8
오래된 폴더 정리
백업 디렉터리라면 보관 기간을 정해서 정리합니다. 다음 예시는 30일보다 오래된 폴더를 목록으로 먼저 확인합니다.
Get-ChildItem -Path "D:\Backup" -Directory |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Select-Object FullName, LastWriteTime
삭제는 목록이 맞는지 확인한 다음 별도 변경 창에서 실행합니다.
Get-ChildItem -Path "D:\Backup" -Directory |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item -Recurse -Force
운영 팁
- 폴더명은 정렬 가능한 날짜 형식으로 둡니다.
yyyy_MM_dd나yyyy-MM-dd가 무난합니다. - 공백과 한글 폴더명은 자동화 도구에서 문제가 될 수 있으므로 백업 경로에는 피하는 편이 좋습니다.
- 예약 작업 계정이 대상 드라이브에 쓰기 권한이 있는지 확인합니다.
- 네트워크 드라이브는 예약 작업 세션에서 매핑이 안 될 수 있으므로 UNC 경로와 권한을 별도로 검증합니다.