Чтение даты и времени из текстового файла с использованием PowerShell Get-Content - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть текстовый файл, который содержит последнее обновление файла журнала.

 Volume in drive E is ISCSI
 Volume Serial Number is XXXXXX

 Directory of E:\Apps\LOGS

02/26/2020  11:39 AM           762,661-vx_02262020.log
               1 File(s)        762,661 bytes
               0 Dir(s)  12,554,166,272 bytes free

Я использую приведенный ниже скрипт powershell, чтобы прочитать содержимое и отправить по электронной почте то же самое:

$Date = (Get-Date -format "MMddyyyy")

$body = Get-Content -path C:\Desktop\Logs\LOG_TIME_$Date.txt -raw

Send-MailMessage -To "abc@gmail.com2" -From "abc@gmail.com"  -Subject "LOG TIME $Date" -Body "$body" -SmtpServer "xxxxx.main.glb.corp.local"

Код работает нормально и отправляет все содержимое файлов в теле на мою электронную почту. Но я только хочу, чтобы дата и время (которые будут постоянно меняться) отправлялись по электронной почте.

Я перепробовал множество вариантов, но ни один из которых не работает:

  • используется | строка выбора "05 /"
  • используется Where-Object
  • используется -Pattern '$ Date' -AllMatches |

Может кто-нибудь помочь мне, как заполнить только дата и время в теле письма из текстового файла?

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Чтобы разобрать дату и время в файле, вы можете использовать это:

$Date = (Get-Date -format "MMddyyyy")

$content = Get-Content -Path "C:\Desktop\Logs\LOG_TIME_$Date.txt" -Raw
if ($content -match '(\d{2}/\d{2}/\d{4}\s+\d{1,2}:\d{2}\s+[AP]M)') {
    $dateString = $matches[1] -replace '\s+', ' '
    $dateInFile = [DateTime]::ParseExact($dateString, 'MM/dd/yyyy h:mm tt', [cultureinfo]'en-UK')
}

$mailParams = @{
    To         = "abc@gmail.com"
    From       = "abc@gmail.com"
    Subject    = "LOG TIME $Date"
    Body       = $dateInFile
    SmtpServer = "xxxxx.main.glb.corp.local"
}

Send-MailMessage @mailParams

Детали регулярного выражения:

(             # Match the regular expression below and capture its match into backreference number 1
   \d         # Match a single digit 0..9
      {2}     # Exactly 2 times
   /          # Match the character "/" literally
   \d         # Match a single digit 0..9
      {2}     # Exactly 2 times
   /          # Match the character "/" literally
   \d         # Match a single digit 0..9
      {4}     # Exactly 4 times
   \s         # Match a single character that is a "whitespace character" (spaces, tabs, line breaks, etc.)
      +       # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
   \d         # Match a single digit 0..9
      {1,2}   # Between one and 2 times, as many times as possible, giving back as needed (greedy)
   :          # Match the character ":" literally
   \d         # Match a single digit 0..9
      {2}     # Exactly 2 times
   \s         # Match a single character that is a "whitespace character" (spaces, tabs, line breaks, etc.)
      +       # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
   [AP]       # Match a single character present in the list "AP"
   M          # Match the character "M" literally
)
0 голосов
/ 26 февраля 2020

Легко делается с помощью регулярных выражений:

$date = $content | ? { $_ -match '(\d{1,2}\/\d{1,2}\/\d{2,4})' } | % { $_ -replace '^(.*)(\d{1,2}\/\d{1,2}\/\d{2,4})(.*)$', '$2' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...