Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/75: Рейтинг темы: голосов - 75, средняя оценка - 4.52
22 / 18 / 4
Регистрация: 28.07.2015
Сообщений: 167

Перевод строки в дату

13.10.2017, 14:34. Показов 16228. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день,
столкнулся со следующей проблемой.
Я собираю данные с компов по дате и времени их включения. Результаты получаю "string" следующего вида

10/3/2017 1:19:57 PM
или
14.09.2017 20:11:13

В зависимости от компа, с которого собираю.
Сбор происходит следующим образом

Invoke-Command -ComputerName ru-mscadm10004 -ScriptBlock {net statistics workstation} | Select-String "Statistics since"
$temp= $temp.remove(0,17)

Я пробовал тянуть из АД, но там данные далеко не всегда корректны. А этот способ показывает точные данные

А вот дальше затык.

Формат даты американский, а я хочу перевести в наш формат DD.mm.YYYY hh:MM
В принципе я готов пожертвовать сасами, но дата должна правильно переводиться всегда.

Что я пробовал
1. get-date ($temp)
2. $b=[datetime]:arse($temp)
3. [DateTime]::ParseExact($temP,"dd/MM/yyyy HH:mm:ss", $null)

В первом случает не меняет формат.
Во втором странно. Вчера все было ОК, а сегодня не меняет.
Третий выдает ошибку Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."

PS Version: 5.1.14393.206

Очень жду совета. Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.10.2017, 14:34
Ответы с готовыми решениями:

Перевод строки в дату
Может все таки есть какая-нибудь функция перевода строки типа "21.01.2010 08:21" в дату? Я сделала через обработку строки, но должно же...

Перевод строки в дату
Вопрос: есть строка "2013-06-28 19:00:00.000". Как её привести к типу дата? Нужно для последующего сравнения.

Перевод строки в дату
Господа, собственно проблема. Дано задание - при вводе строки типа YYYY-MM-DD программа должна определить является ли данная строка...

19
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,191
13.10.2017, 14:54
Цитата Сообщение от MGarry Посмотреть сообщение
В первом случает не меняет формат.
А почему должен меняться формат?
Например у меня:
PowerShell
1
2
3
4
5
PS > get-date("10/3/2017 1:19:57 PM")
10 марта 2017 г. 13:19:57
 
PS > get-date("14.09.2017 20:11:13")
14 сентября 2017 г. 20:11:13
А чтобы поменять формат вывода:
PowerShell
1
2
3
4
PS > get-date("10/3/2017 1:19:57 PM") -form T
13:19:57
PS > get-date("10/3/2017 1:19:57 PM") -form yyyy
2017
да и вообще, используйте сначала: man get-date -full
0
22 / 18 / 4
Регистрация: 28.07.2015
Сообщений: 167
13.10.2017, 15:02  [ТС]
Поясню, в первом случае дата 3 октября 2017, а не 10 марта.
во втором случае 14 сентября 2017. (тут то все просто)

А как быть с первым вариантом. Как 10/3/2017 перевести в дату 03.10.2017 (3 октября 2017)
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,191
13.10.2017, 15:21
Цитата Сообщение от MGarry Посмотреть сообщение
в первом случае дата 3 октября 2017, а не 10 марта.
PowerShell
1
2
PS > [datetime]"10/3/2017 1:19:57 PM"
3 октября 2017 г. 13:19:57
0
22 / 18 / 4
Регистрация: 28.07.2015
Сообщений: 167
13.10.2017, 15:37  [ТС]
Спасибо, с этим типом разобрались, но когда в цикл попадает дата второго типа 13.10.2017 8:45:08 он начинает ругаться

Cannot convert value "13.10.2017 8:45:08" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."

Как можно различать эти даты, чтобы я IF использовал?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
13.10.2017, 17:02
Цитата Сообщение от MGarry Посмотреть сообщение
Cannot convert value "13.10.2017 8:45:08" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."
Как можно различать эти даты, чтобы я IF использовал?
Вариант с IF

PowerShell
1
2
3
4
5
6
7
'10/3/2017 1:19:57 PM','14.09.2017 20:11:13' | %{
    
    if ($_ -match 'AM|PM|/'){$date = [datetime]$_}
    else {$date = Get-Date $_}
    Write-Host "$_ ->" $date.DateTime
 
}
Вариант с перехватом ошибки

PowerShell
1
2
3
4
5
6
7
8
9
foreach ($item in '10/3/2017 1:19:57 PM','14.09.2017 20:11:13')
{
 
    try   {$date = [datetime]$item}
    catch [System.InvalidCastException] {$date = get-date $item}
 
    Write-Host "$item ->" $date.DateTime
    
}
10/3/2017 1:19:57 PM -> 3 октября 2017 г. 13:19:57
14.09.2017 20:11:13 -> 14 сентября 2017 г. 20:11:13
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
13.10.2017, 17:23
Цитата Сообщение от MGarry
Cannot convert value "13.10.2017 8:45:08" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."
На самом деле все дело в разности культур, точнее формата дат в них. Об этом достаточно часто забывают (недаром ведь есть командлет Get-UICulture). В PowerShell фокус сосредоточен на дате US формата, хотя с идеологической точки зрения было бы правильно гонять даты в каком-то стандартизированном формате, скажем, ISO. KDE777, в общем-то уже привел пример обхода проблемы через if\try-catch, но лично я бы так делать не стал, а просто переводил бы саму дату в US формат, а уже после конвертировал ее в DateTime, например, так:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function ConvertTo-DateTime {
  param(
    [Parameter(Mandatory=$true, ValuefromPipeline=$true)]
    [String]$DateTime
  )
 
  $m = (($arr = (
    Get-UICulture).DateTimeformat.ShortDatePattern -split '/|-|\.'
  ) | Select-String -Pattern 'M').LineNumber - 1
  $d = ($arr | Select-String -Pattern 'd').LineNumber - 1
  $y = ($arr | Select-String -Pattern 'y').LineNumber - 1
 
  $cur = $DateTime -split '/|-|\.| '
  [DateTime]"$($cur[$m])/$($cur[$d])/$($cur[$y]) $($cur[$cur.Length - 1])"
}
На выходе:
Code
1
2
3
4
5
PS C:\> ConvertTo-DateTime '13/10/2017 8:53:08'
13 октября 2017 г. 8:53:08
 
PS C:\> ConvertTo-DateTime '8.10.2017 13:53:01'
8 октября 2017 г. 13:53:01
Если поработать напильником, то и вовсе можно получить алюминевый леденец.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
13.10.2017, 18:10
Цитата Сообщение от greg zakharov Посмотреть сообщение
в общем-то уже привел пример обхода проблемы через if\try-catch, но лично я бы так делать не стал
Согласен, я бы лично эту задачу тоже решил совсем иначе, т.к. парсить текстовый результат выполнения net statistics, а затем ещё использовать if\try-catch - выглядит какими-то костылями Просто ответил MGarry на вопрос про IF

Цитата Сообщение от MGarry Посмотреть сообщение
Я собираю данные с компов по дате и времени их включения.

Сбор происходит следующим образом
Invoke-Command -ComputerName ru-mscadm10004 -ScriptBlock {net statistics workstation} | Select-String "Statistics since"
$temp= $temp.remove(0,17)
Я пробовал тянуть из АД, но там данные далеко не всегда корректны. А этот способ показывает точные данные
Я бы сделал так - берём из системного журнала последнее событие 6009 и получаем время включения, причём сразу в System.DateTime формате:

PowerShell
1
Get-WinEvent -ComputerName $pc -MaxEvents 1 -FilterHashTable @{logname = "System"; ID = 6009} | select MachineName,TimeCreated
Добавлено через 9 минут
+

greg zakharov, попробовал у себя ваш вариант:

Code
1
2
PS C:\> ConvertTo-DateTime '10/3/2017 1:19:57 PM'
10 марта 2017 г. 12:00:00
Но автор темы пишет:

Цитата Сообщение от MGarry Посмотреть сообщение
Поясню, в первом случае дата 3 октября 2017, а не 10 марта.
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,191
13.10.2017, 18:52
Цитата Сообщение от MGarry Посмотреть сообщение
Как можно различать эти даты, чтобы я IF использовал?
Вот в этом месте:
Цитата Сообщение от MGarry Посмотреть сообщение
3. [DateTime]::ParseExact($temP,"dd/MM/yyyy HH:mm:ss", $null)
надо использовать не $null, а соответствующее указание региональных параметров:
PowerShell
1
2
PS > [datetime]::parseexact("10/3/2017 1:19:57 PM", "M/d/yyyy h:mm:ss tt", (new-object cultureinfo("en-US")))
3 октября 2017 г. 13:19:57
и всё, что не парсится, ловить try-catch и вписывать то, что требуется...

Добавлено через 2 минуты
Цитата Сообщение от KDE777 Посмотреть сообщение
автор темы пишет:
Там можно подпилить код, поменяв местами $d и $m, это не проблема. Проблема там в том, что также не обрабатывается переключатель AM/PM ... но пилить можно всё, даже из паровоза самолет можно выпилить
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
13.10.2017, 18:57
Цитата Сообщение от KDE777
Но автор темы пишет
Именно по этой причине в своем ответе указал, во-первых, вектор проблемы - в данном случае различие культур, - во-вторых, что приводимый код лишь пример, от которого можно было бы оттолкнуться, не более того. Повторюсь, что в PowerShell заморочки с датами в различных культурах не учитываются со времен первой версии.
Цитата Сообщение от KDE777
Я бы сделал так - берём из системного журнала последнее событие 6009 и получаем время включения, причём сразу в System.DateTime формате
Также можно споткнуться на культурах, если конечно в сети компьютеры с разными локалями. Так что вполне вариант.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
15.10.2017, 21:04
Цитата Сообщение от greg zakharov Посмотреть сообщение
Также можно споткнуться на культурах, если конечно в сети компьютеры с разными локалями.
Предложенный мной вариант с Get-WinEvent - во первых не "спотыкается на культурах", а во вторых, в отличие от Invoke-Command {net statistics workstation}, ещё и понимает тайм зону (TZ) удалённого хоста. Проверим:

Выполняю на машине: Win RU, Региональные стандарты: Россия, TZ UTC+3
Удалённый хост: Win EN, Региональные стандарты: US

PowerShell
1
2
Invoke-Command -ComputerName $pc -ScriptBlock {net statistics workstation} | Select-String "Statistics since"
(Get-WinEvent -ComputerName $pc -MaxEvents 1 -FilterHashTable @{logname = "System"; ID = 6009}).TimeCreated.datetime
Пример 1 - на ПК исполняющем скрипт и $pc TZ одинаковые:

Code
1
2
Statistics since 10/15/2017 8:17:59 PM
15 октября 2017 г. 20:17:56
Пример 2 - на ПК исполняющем скрипт TZ UTC+3, а на $pc UTC0

Code
1
2
Statistics since 10/15/2017 5:17:59 PM
15 октября 2017 г. 20:17:56
greg zakharov, Get-WinEvent разобрался с Culture для [10/15/2017 5:17:59 PM] и бонусом перевёл UTC0 в мои UTC+3

MGarry, обратите внимание, что используя Invoke-Command {net statistics workstation} вы получаете время в TZ удалённого хоста. А значит, если не узнать TZ хоста указанного в -ComputerName, то совершенно не ясно сколько это на самом деле.
0
22 / 18 / 4
Регистрация: 28.07.2015
Сообщений: 167
16.10.2017, 13:24  [ТС]
Спасибо большое за ответы. Вроде работает скрипт. Для информации я приведу его ниже.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# Модуль выборки
$data=Get-ADUser -Filter {Department -like "IT Department"} -SearchBase "OU=****,OU=*****,OU=**,OU=***,DC=****,DC=***,DC=SOCGEN" -properties * 
 
#Подключение к базе IT Invent
$dataSource = "ru-mscsql**\**"
$DB = "IT_invent"
$user = "***"
$pwd = "*******"
$connectionString = “Server=$dataSource;Database = $DB;uid=$user; pwd=$pwd;Integrated Security=False;”
$connection = New-Object System.Data.SqlClient.SqlConnection
 
#модуль отправки писем по условию
 
foreach ($item in $data)
{           
               
$name= $item | select -ExpandProperty SamAccountName
$connection.ConnectionString = $connectionString
$connection.Open()
$query = "SELECT dbo.ITEMS.[INV_NO_BUH] FROM dbo.OWNERS  INNER JOIN dbo.ITEMS ON dbo.OWNERS.OWNER_NO = dbo.ITEMS.EMPL_NO  WHERE  (NOT (dbo.ITEMS.INV_NO_BUH IS NULL)) AND (dbo.OWNERS.OWNER_LOGIN = '$name') AND (dbo.ITEMS.CI_TYPE = 1)"
$command = $connection.CreateCommand()
$command.CommandText = $query
$result = $command.ExecuteReader()
$table = new-object “System.Data.DataTable”
$table.Load($result)
$comp=$table | select -ExpandProperty inv_no_buh
$Connection.Close()
 
 
                if (Test-Connection $comp -Quiet -count 2 -ErrorAction Continue)
                {
                [string]$temp= Invoke-Command -ComputerName $comp -ScriptBlock {net statistics workstation} | Select-String "Statistics since"
                $temp= $temp.remove(0,17)
                        if($temp -like "*.*")
                         {$b=[datetime]::parse($temp)}      
                        Else
                        {$b=[datetime]$temp}
                    if ($b -lt (get-date).AddHours(-24))
                    {
 
                    
                    #Поиск почты и Имени пользователя
                    $mail=$item | select -ExpandProperty mail 
                    $DisplayName= $item  | select -ExpandProperty DisplayName
                   
                    $day=$b.Day
                    $month=$b.Month
                    $year=$b.Year
                    $hour=$b.Hour
                    $minute=$b.Minute
                    
 
                    
                    Send-MailMessage -Body "Уважаемый $DisplayName, <br><br>Ваш компьютер не выключался более 1 суток. Пожалуйста, выключите его сегодня, уходя домой. В противном случае он будет выключен автоматически, возможно, с потерей данных. Eсли по рабочим причинам вам нужно оставить компьютер работающим в нерабочее время, пожалуйста, обратитесь в отдел ИТ с соответствующими объяснениями.<br>Компьютер нужно выключать в обязательном порядке ежедневно. Это необходимо для:<br>1. поддержания безопасности в связи с применением обновлений Windows<br>2. для экономии электроэнергии" -From ru.itwatchdogs@****** -SmtpServer *** -Subject "Не забывайте выключать компьютер" -Encoding UTF8 -to $mail -BodyAsHtml
                    $account= $null
                    $b= $null
                    $temp= $null
                    }           
                }
}
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
16.10.2017, 16:35
Цитата Сообщение от MGarry Посмотреть сообщение

PowerShell
1
2
3
4
5
6
[string]$temp= Invoke-Command -ComputerName $comp -ScriptBlock {net statistics workstation} | Select-String "Statistics since"
$temp= $temp.remove(0,17)
if($temp -like "*.*")
{$b=[datetime]:Parse($temp)}
Else
{$b=[datetime]$temp}
Интереса ради - почему всё-таки выбрали такое решение, вместо одной строчки гарантированно возвращающей сразу System.DateTime формат?

PowerShell
1
$b = (Get-WinEvent -ComputerName $comp -MaxEvents 1 -FilterHashTable @{logname = "System"; ID = 6009}).TimeCreated
Решение - Invoke-Command -ComputerName $comp -ScriptBlock {net statistics workstation} - возвращает:

- дату/время в разных региональных стандартах (Culture)
- время из неизвестной TZ
- В строке с временем, вместо "Statistics since", может быть фраза на русском "Статистика после" или любом другом языке удалённой ОС
0
22 / 18 / 4
Регистрация: 28.07.2015
Сообщений: 167
16.10.2017, 16:42  [ТС]
Полгода назад я пытался брать оттуда, но выплыло несколько косяков. (Есть тема в этой ветке) и поэтому настороженно отношусь к Event.

Хотя когда я пытался через Event работать, до такого решения я не додумался.. Выглядит очень красиво.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
16.10.2017, 23:03
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# время работы системы без перезагрузки в формате 00:00:00.0000000
"$((get-date)-(ps winlogon).StartTime)"
# или так
"$(New-TimeSpan (ps winlogon).StartTime)"
 
# время работы системы без перезагрузки в формате 00:00
((get-date)-(ps winlogon).StartTime).ToString("hh':'mm")
# или так
(New-TimeSpan (ps winlogon).StartTime).ToString("hh':'mm")
 
# время работы системы без перезагрузки в формате 00
((get-date)-(ps winlogon).StartTime).ToString("hh")
# или так
(New-TimeSpan (ps winlogon).StartTime).ToString("hh")
И не нужно ничего парсить и думать о формате разных культур и локалей. Получаем сразу число часов, приводим его к типу int акселератором [int] и с чем-то его сравниваем.

PowerShell
1
2
# или сразу в int
((get-date)-(ps winlogon).StartTime).TotalHours
Добавлено через 9 минут
Если нужно тотальное время работы системы без учета перезагрузок, то вроде бы этот счетчик не сбрасывается в течение почти месяца.
PowerShell
1
[int]([TimeSpan]::FromMilliseconds([Environment]::TickCount)).TotalHours
Добавлено через 36 минут
Хотя, нет - после перезагрузки тоже сбрасывается

Добавлено через 1 минуту
Впрочем, net statistics workstation тоже начинает отсчет статистики с текущего времени после перезагрузки системы.
1
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
17.10.2017, 13:45
Цитата Сообщение от Garry Galler Посмотреть сообщение
ps winlogon
Тоже не плохой способ, но с некоторыми оговорками:

1. Get-Process winlogon с ключом -ComputerName не возвращает StartTime, т.е. для удалённого ПК нужно всё равно запускать через Invoke-Command
2. Winlogon процессов может быть несколько, а значит нужно это учитывать + выбирать самый старый
PowerShell
1
ps winlogon | sort StartTime | select -First 1
Пример:

PowerShell
1
2
3
4
5
6
"Invoke-Command:"
Invoke-Command -ComputerName $pc -ScriptBlock {(ps winlogon).StartTime}
"`nGet-WinEvent:"
(Get-WinEvent -ComputerName $pc -MaxEvents 1 -FilterHashTable @{logname = "System"; ID = 6009}).TimeCreated
"`nGet-Process:"
Get-Process winlogon -ComputerName $pc | select StartTime
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Invoke-Command:
 
15 октября 2017 г. 16:44:40
17 октября 2017 г. 12:13:42
17 октября 2017 г. 13:32:10
 
Get-WinEvent:
 
15 октября 2017 г. 16:45:04
 
Get-Process:
 
StartTime : 
StartTime : 
StartTime :
0
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
19.10.2017, 19:47
Цитата Сообщение от KDE777 Посмотреть сообщение
Интереса ради - почему всё-таки выбрали такое решение, вместо одной строчки гарантированно возвращающей сразу System.DateTime формат?
PowerShellВыделить код
1
$b = (Get-WinEvent -ComputerName $comp -MaxEvents 1 -FilterHashTable @{logname = "System"; ID = 6009}).TimeCreated
У меня это является приемом предпоследнего шанса, когда не работает ничего другое.
Дело в том, что в конце рабочего дня для получения этого значения может понадобится до 10 минут
Последний шанс - перехват вывода команды net time

Кроме того народ почему-то не вспомнил

PowerShell
1
Get-WmiObject -Class win32_operatingsystem -Property LastBootUpTime
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
20.10.2017, 10:30
Цитата Сообщение от Cat2 Посмотреть сообщение
У меня это является приемом предпоследнего шанса, когда не работает ничего другое.
Дело в том, что в конце рабочего дня для получения этого значения может понадобится до 10 минут
А вы не путаете Get-EventLog c Get-WinEvent? Пробовали запускать Get-WinEvent именно с ключом -MaxEvents и показанным фильтром?

Специально попробовал выполнить этот запрос для удалённого (задержки ~40ms), нагруженного сервера, с аптаймом 62 дня - свойство TimeCreated было получено через TotalMilliseconds : 899,5706. А это в 666 раз быстрее 10 минут

Цитата Сообщение от Cat2 Посмотреть сообщение
Кроме того народ почему-то не вспомнил
PowerShell
1
Get-WmiObject -Class win32_operatingsystem -Property LastBootUpTime
Согласен, это ещё один хороший способ. Я только дополню его примером, как получить DateTime-формат

PowerShell
1
2
$LastBootUpTime = Get-WmiObject win32_operatingsystem -ComputerName $pc -Property LastBootUpTime
$LastBootUpTime.ConvertToDateTime($LastBootUpTime.LastBootUpTime)
0
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
20.10.2017, 20:04
Цитата Сообщение от KDE777 Посмотреть сообщение
А вы не путаете Get-EventLog c Get-WinEvent? Пробовали запускать Get-WinEvent именно с ключом -MaxEvents и показанным фильтром?
Спасибо, я действительно пробовал только фильтрацию Get-EventLog.
Проверю, хотя у меня сразу сомнение насчет эффективности этого способа просмотра.
Насколько я знаю, системные логи не имеют индексов и всё всегда сводится к простому сканированию записей.
Буду приятно удивлен, если Get-WinEvent работает быстрее

Добавлено через 12 минут
Цитата Сообщение от KDE777 Посмотреть сообщение
Специально попробовал выполнить этот запрос для удалённого (задержки ~40ms), нагруженного сервера, с аптаймом 62 дня - свойство TimeCreated было получено через TotalMilliseconds : 899,5706. А это в 666 раз быстрее 10 минут
Не сразу обратил внимание , что проба была на сервере.
Попробуйте это на рабочей станции с гигом опереативки при 100% загрузке процессора.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
21.10.2017, 17:11
Цитата Сообщение от Cat2 Посмотреть сообщение
Проверю, хотя у меня сразу сомнение насчет эффективности этого способа просмотра.
Вместо сомнений, просто попробуйте показанный вам пример. Get-WinEvent доступен с 2009 года, поэтому легко найти информацию об отличиях с Get-EventLog...

Besides accessing Application event logs, the big advantage of Get-WinEvent is supposed to be performance, especially when retrieving logs from remote computers. If you use one of the Filter parameters, the event engine does the filtering before passing the events (potentially across the network) back to PowerShell.
Цитата Сообщение от Cat2 Посмотреть сообщение
Не сразу обратил внимание , что проба была на сервере.
Попробуйте это на рабочей станции с гигом опереативки при 100% загрузке процессора.
Этот сервер и был взят для примера, т.к. является самым загруженным из-за своей слабой конфигурации + сетевой маршрут до него из 5 хопов и задержка 40ms. Рабочие станции в одном со мной офисе отвечают на запрос намного быстрее.

Сейчас выходной и у меня в сети всего 69 работающих ПК. Просто последовательный сбор данных, с помощью Get-WinEvent из EventLog на каждом из них занял 28 сек. (при первом проходе). Последовательно запущенный на тех же ПК Get-WmiObject win32_operatingsystem занял 38 сек.(при первом проходе). При повторных запусках Get-WinEvent проходится по этим же ПК за 11 сек., а Get-WmiObject за 7 сек.

А если поступить умней и автоматически разбить задачу на Job'ы, например в каждом собирать данные только с 10 ПК, то получение данных из EventLog с 69 ПК, с помощью Get-WinEvent у меня заняло 4 сек.

Я не утверждаю, что из всех перечисленных здесь способов Get-WinEvent самый быстрый. Но он точно не работает минуты, там где другие способы отрабатывают за миллисекунды.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.10.2017, 17:11
Помогаю со студенческими работами здесь

Перевод строки в дату
Зaпутaлcя в кoнец ... Кaк из cтрoки перевеcти в дaту ??? String 20050226 --&gt;&gt; Date 02/26/2005

Универсальный перевод строки в дату
Здравствуйте. Есть вот такая строка: &quot;20.02.2020&quot; И если попытаться превратить её в дату с помощью Convert.ToDateTime, то всё будет...

Заменить в строке все пробелы на перевод строки, а перевод строки изменить на два перевода
Меня интересует следующий вопрос: как заменить в моем стринге все пробелы на переходы на новую строку, а переходы на новую строку изменить...

Разбиение строки на части, перевод строки в число и перевод числа
Есть задание: 1. Необходимо реализовать консольное приложение, позволяющее манипулировать строкой, разбив ее на элементы путем...

Перевод секунд в дату
написал програмку, которая переводит секунды в дату. и столкнулся с проблемой что если секунды больше или около значения 2147483648...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru