Моя операционная система — Windows 10.
У меня есть папка, содержащая один или несколько файлов .txt. Внутри каждого файла есть строки, отформатированные следующим образом:
2016-12-07 14:08:43 7.7 б=123 г=890
Я хочу создать воспроизводимый процесс, который я смогу выполнить, чтобы просмотреть все файлы в папке и предоставить мне имена файлов в файле .txt всех файлов, которые содержат 6.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
}
}
}
}
или эквивалентный однострочник
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
и|
передать результат следующему командлету - (трубчатый)для каждого конкретного файла
ForEach-Object
- сохраните его во вспомогательной переменной
$aux=$_
(обратите внимание на;
точку с запятой в конце однострочника) - и получить его содержимое построчно
Get-Content
и|
передать результат следующему командлету - (трубчатый)для каждой конкретной строки
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
}
}
}
}