내 운영 체제는 Windows 10입니다.
하나 이상의 .txt 파일이 포함된 폴더가 있습니다. 각 파일에는 다음과 같은 형식의 줄이 있습니다.
2016-12-07 14:08:43 7.7 b=123 r=890
나는 폴더의 모든 파일을 살펴보고 포함된 모든 파일의 .txt 파일 이름 6.7
과 7일 이전 날짜를 제공하는 실행 가능한 재현 가능한 프로세스를 만들려고 합니다.
예시 시나리오:
파일1에는 다음이 포함됩니다.2016-12-07 14:08:43 7.7 b=123 r=890
파일 2에는 다음이 포함됩니다.2017-01-24 14:08:43 7.7 b=123 r=890
파일3에는 다음이 포함됩니다.2017-01-23 14:08:43 6.7 b=123 r=890
프로세스를 실행하면 다음이 포함된 .txt 파일이 수신됩니다.File3
명령줄이나 PowerShell을 사용하여 이 작업을 수행할 수 있는지, 아니면 이 작업을 수행하려면 완전한 개발 노력이 필요한지 모르겠습니다.
답변1
PowerShell 스크립트 따르기
Get-ChildItem *.txt -Recurse |
ForEach-Object {
$aux=$_
Get-Content "$aux" |
ForEach-Object {
if ($_ -match '6\.7') {
if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7)) {
$aux.FullName
}
}
}
}
또는 이에 상응하는 oneliner
Get-ChildItem *.txt -Recurse | ForEach-Object { $aux=$_; Get-Content "$aux" | ForEach-Object {if ($_ -match '6\.7') {if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7)) {$aux.FullName}}}}
기본 설명:
txt
파일 목록을 가져오고Get-ChildItem
결과|
를 다음 cmdlet으로 파이프합니다.- (파이프)모든 특정 파일에 대해
ForEach-Object
- 보조 변수에 저장합니다
$aux=$_
(;
oneliner의 후행 세미콜론 참고). - 내용을 한 줄씩 가져오고
Get-Content
결과|
를 다음 cmdlet으로 파이프합니다. - (파이프)모든 특정 라인에 대해
ForEach-Object
- 줄에
6.7
문자열이 포함되어 있는지 테스트if ($_ -match '6\.7')
- 그렇다면 날짜(처음 19자)가 주어진 기준과 일치하는지 테스트합니다.
if ( [datetime] …
- 그렇다면 공개 파일 이름을 만드십시오.
$aux.FullName
{
일련의 종료 s를 사용하여 모든 오프닝 s를 닫습니다}
.
답변2
JosefZ의 원래 답변을 확장하면 다음 답변이 더 완전하다는 것을 알았습니다.
PowerShell 파일 내에 다음을 포함합니다.
$filespath = "\\sampledirectory\log\"
$outputfilename = "\\sampledirectory\log\results.txt"
########## file creation step
Get-ChildItem -Path $filespath *.txt -Recurse |
ForEach-Object {
$aux=$_
Get-Content "$aux" |
ForEach-Object {
if ($_ -match '6\.7')
{
if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7))
{
$aux.FullName | Out-File $outputfilename -append
}
}
}
}