2010-01-06 4 views
1

간단한 백업 프로세스의 일부로 백업 날짜 및 시간을 나타내는 이름으로 파일을 저장하고 싶습니다. 현재는 yyyyMMddTHHmmss 즉 "20100601T115720"을 사용하고 있습니다. 그 날짜를 다시 분석하여 특정 날짜보다 오래된 파일을 정리할 수 있기를 원합니다. (. 백업 날짜 시간은 파일을 만든 날짜와 같은 필요는 없습니다)이 궁극적으로 다음과 같은 줄 것을 이용하여, 파워 쉘에서 실행 : 나는 현재 DateTime.ParseExact 방법을 사용하고Windows 파일 이름으로 유효하며 DateTime.Parse를 사용하여 구문 분석 할 수있는 표준 DateTime 문자열 표현이 있습니까?

Get-ChildItem $backupDirectory -filter *.bak | where { [System.DateTime]::ParseExact([System.IO.Path]::GetFileNameWithoutExtension($_), "yyyyMMddTHHmmss", [System.Globalization.CultureInfo]::InvariantCulture) -lt $oldestDate } 

참고. 이 위대한 작품, 그래서 내 질문은 더 학문적 인 것 같아요,하지만 난 궁금하네요 경우가 "표준"윈도우 파일 이름 형식 :

  • 날짜 및 시간 정보 및
  • 구문 분석 할 수 모두 포함
+0

이 너무 snarky되지 않도록하는 데 도움을 ...하지만 정말 ... 표준에 대한이있다 아무것도? ;-) SQL/UNIX 시간 등의 네이티브 스토리지에 일반적으로 얼마나 많은 날짜/시간 형식이 있는지 살펴보십시오. – Nick

+0

Nick : SQL에는 해당 유형이 있으며 실제 저장 방법은 구현 세부 사항입니다. (2038 년 이전의 날짜로 제한하지 않는 한) 걱정할 필요가 없습니다. 서식을 지정하는 방법은 다른 문제이며 최대입니다. – Joey

답변

4

표준 "DateTime.Parse"를 사용하는 것은 표준 파일 이름 형식이 아닙니다.

일반적으로 yyyy-MM-dd, HH-mm-ss을 사용합니다. 이는 숫자가 많은 것보다 훨씬 읽기 쉽습니다.

1

찾을 수있는 표준 파일 이름 형식이 없지만이 트릭은 PowerShell 출력을 지역화 된 읽을 수있는 날짜/시간 (예 : 2 월 2 일 2010 8:15:14 AM)으로 만들기 쉽습니다. : 아웃 문자열에

(Get-Date | Out-String).Trim().Replace(":", "-") 

배관은 Get-날짜가 기본 포맷을 사용한다 (이 경우, 현재 로케일의 시간) 날짜 읽을 수있는 문자열을 확인합니다. Trim()은 양 끝에서 추가 개행을 제거합니다. 내가 알고있는 로케일 중 타임 스트링의 유일한 불법 문자는 ':'이며, 단순히 ':'을 '-'로 대체합니다.

.NET의 문자열 포맷을 사용하는 것보다 훨씬 느린 노치입니다. 당신이 cmdlet을 사용하지 않고 같은 트릭을 사용하려는 경우, 당신은이 방법을 쓸 수 있습니다 :

$date = [DateTime]::Now 
($date.ToLongDateString() + " " + $date.ToLongTimeString()).Replace(":",'-') 

는 희망이

+0

필자는 파일 이름에 unsortable timestamps를 사용하는 것은 좋지 않다고 생각합니다. ISO 8601을 닮은 것은 괜찮지 만 임의의 다른 형식이 아니어야합니다. 특히 로케일 설정에 의존하는 것은 위험합니다. 즉, 형식이 갑자기 변경 될 수 있고 파일의 절반을 한 형식으로, 나머지 절반을 다른 형식으로 가져 오는 것을 의미합니다. – Joey

관련 문제