Как записать процессы в файл XML с помощью Powershell? - PullRequest
0 голосов
/ 16 марта 2019

Экспорт процессов в файл CSV, по-видимому, делает снимок, а затем просто записывает его.Тем не менее, вариант XML создает файл журнала, который он, по-видимому, записывает в неопределенное время.

Как записать результаты сценария csv.ps1 в файл XML?

csv.ps1

Get-Process | Export-Csv -Path .\Processes.csv -NoTypeInformation

Processes.csv, после запуска csv.ps1:

"writeback","0",,"0","0","0","0",,"System.Diagnostics.Process (kthreadd)",,"0",,,,,"Process","Microsoft.Win32.SafeHandles.SafeProcessHandle","30","-20",,"False","2019-03-16 7:37:18 a.m.",,"30",".","9223372036854775807","0","System.Diagnostics.ProcessModuleCollection","0","0","0","0","0","0","0","0","0","0","0","0","False","RealTime","0","0","writeback","3","0",,"System.Diagnostics.ProcessThreadCollection",,"0","0","False",,,,"0","0",,,"0","","True","00:00:00","00:00:00","00:00:00",,
"xbrlapi","3233",,"0","0","0","0",,"System.Diagnostics.Process (gnome-session-b)",,"0",,,,,"Process","Microsoft.Win32.SafeHandles.SafeProcessHandle","3419","0",,"False","2019-03-16 7:45:43 a.m.",,"3419",".","9223372036854775807","0","System.Diagnostics.ProcessModuleCollection","0","0","0","0","0","0","0","0","0","0","0","0","False","Normal","0","0","xbrlapi","3","3233",,"System.Diagnostics.ProcessThreadCollection",,"0","0","False",,,,"0","0",,,"0","","True","00:00:00","00:00:00","00:00:00",,
"xdg-desktop-por","12972","10","573689856","8712192","0","0","/usr/libexec/xdg-desktop-portal","System.Diagnostics.Process (systemd)",,"0.06",,,,,"Process","Microsoft.Win32.SafeHandles.SafeProcessHandle","12972","0",,"False","2019-03-16 10:29:22 a.m.",,"12972",".","9223372036854775807","0","System.Diagnostics.ProcessModuleCollection","0","0","0","0","0","0","0","0","0","0","0","0","False","Normal","0","0","xdg-desktop-por","3","12972",,"System.Diagnostics.ProcessThreadCollection","10","573689856","573689856","False",,,,"8712192","8712192",,"System.Diagnostics.ProcessModule (xdg-desktop-portal)","0","","True","00:00:00.0300000","00:00:00.0600000","00:00:00.0300000",,
"xdg-desktop-por","13006","10","474832896","16887808","0","0","/usr/libexec/xdg-desktop-portal-gtk","System.Diagnostics.Process (systemd)",,"0.16",,,,,"Process","Microsoft.Win32.SafeHandles.SafeProcessHandle","13006","0",,"False","2019-03-16 10:29:23 a.m.",,"13006",".","9223372036854775807","0","System.Diagnostics.ProcessModuleCollection","0","0","0","0","0","0","0","0","0","0","0","0","False","Normal","0","0","xdg-desktop-por","3","13006",,"System.Diagnostics.ProcessThreadCollection","10","474832896","474832896","False",,,,"16887808","16887808",,"System.Diagnostics.ProcessModule (xdg-desktop-portal-gtk)","0","","True","00:00:00.0200000","00:00:00.1600000","00:00:00.1400000",,
"xdg-document-po","3375",,"482291712","5652480","0","0",,"System.Diagnostics.Process (systemd)",,"0.08",,,,,"Process","Microsoft.Win32.SafeHandles.SafeProcessHandle","3375","0",,"False","2019-03-16 7:45:42 a.m.",,"3375",".","9223372036854775807","0","System.Diagnostics.ProcessModuleCollection","0","0","0","0","0","0","0","0","0","0","0","0","False","Normal","0","0","xdg-document-po","3","3375",,"System.Diagnostics.ProcessThreadCollection",,"482291712","482291712","False",,,,"5652480","5652480",,,"0","","True","00:00:00","00:00:00.0800000","00:00:00.0800000",,
"xdg-document-po","12985","8","482291712","5857280","0","0","/usr/libexec/xdg-document-portal","System.Diagnostics.Process (systemd)",,"0.03",,,,,"Process","Microsoft.Win32.SafeHandles.SafeProcessHandle","12985","0",,"False","2019-03-16 10:29:22 a.m.",,"12985",".","9223372036854775807","0","System.Diagnostics.ProcessModuleCollection","0","0","0","0","0","0","0","0","0","0","0","0","False","Normal","0","0","xdg-document-po","3","12985",,"System.Diagnostics.ProcessThreadCollection","8","482291712","482291712","False",,,,"5857280","5857280",,"System.Diagnostics.ProcessModule (xdg-document-portal)","0","","True","00:00:00.0100000","00:00:00.0300000","00:00:00.0200000",,
"xdg-permission-","3382",,"255184896","4739072","0","0",,"System.Diagnostics.Process (systemd)",,"0",,,,,"Process","Microsoft.Win32.SafeHandles.SafeProcessHandle","3382","0",,"False","2019-03-16 7:45:43 a.m.",,"3382",".","9223372036854775807","0","System.Diagnostics.ProcessModuleCollection","0","0","0","0","0","0","0","0","0","0","0","0","False","Normal","0","0","xdg-permission-","3","3382",,"System.Diagnostics.ProcessThreadCollection",,"255184896","255184896","False",,,,"4739072","4739072",,,"0","","True","00:00:00","00:00:00","00:00:00",,
"xdg-permission-","12992","7","255184896","4780032","0","0","/usr/libexec/xdg-permission-store","System.Diagnostics.Process (systemd)",,"0",,,,,"Process","Microsoft.Win32.SafeHandles.SafeProcessHandle","12992","0",,"False","2019-03-16 10:29:22 a.m.",,"12992",".","9223372036854775807","0","System.Diagnostics.ProcessModuleCollection","0","0","0","0","0","0","0","0","0","0","0","0","False","Normal","0","0","xdg-permission-","3","12992",,"System.Diagnostics.ProcessThreadCollection","7","255184896","255184896","False",,,,"4780032","4780032",,"System.Diagnostics.ProcessModule (xdg-permission-store)","0","","True","00:00:00","00:00:00","00:00:00",,
"Xorg","1369",,"490586112","98332672","0","0",,"System.Diagnostics.Process (lightdm)",,"131.97",,,,,"Process","Microsoft.Win32.SafeHandles.SafeProcessHandle","1369","0",,"False","2019-03-16 7:38:02 a.m.",,"1369",".","9223372036854775807","0","System.Diagnostics.ProcessModuleCollection","0","0","0","0","0","0","0","0","0","0","0","0","False","Normal","0","0","Xorg","3","1369",,"System.Diagnostics.ProcessThreadCollection",,"490586112","490586112","False",,,,"98332672","98332672",,,"0","","True","00:00:43","00:02:11.9700000","00:01:28.9700000",,
"Xorg","12550",,"499658752","84373504","0","0",,"System.Diagnostics.Process (lightdm)",,"44.97",,,,,"Process","Microsoft.Win32.SafeHandles.SafeProcessHandle","12550","0",,"False","2019-03-16 10:29:11 a.m.",,"12550",".","9223372036854775807","0","System.Diagnostics.ProcessModuleCollection","0","0","0","0","0","0","0","0","0","0","0","0","False","Normal","0","0","Xorg","3","12550",,"System.Diagnostics.ProcessThreadCollection",,"499658752","499658752","False",,,,"84373504","84373504",,,"0","","True","00:00:15.0800000","00:00:44.9700000","00:00:29.8900000",,

xml.ps1

Get-Process | Export-Clixml pi.xml

После запуска xml.ps1 pi.xml заканчивается следующим образом:

              <S N="BaseAddress">140154072023040</S>
              <I32 N="ModuleMemorySize">208896</I32>
              <S N="EntryPointAddress">0</S>
            </Props>
          </Obj>
        </IE>
      </Obj>
    </Props>
  </Obj>
</Objs>

(Да, я полагаю, я мог бы преобразовать CSV в XML, я больше спрашиваю, как использовать это XML средство непосредственно из powershell без дополнительных шагов.)

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

См. Также:

1 Ответ

2 голосов
/ 17 марта 2019

Редактировать - Сначала я ответил на вопрос в том виде, в котором он был представлен первоначально, вокруг вопроса: «Почему у меня проблемы с Export-Clixml, но см. Мое изменение ниже для решения, включающего ConvertTo-Xml».

Интересный вопрос! Я полагаю, что ответ связан не с потоковой передачей, а с производительностью и сериализацией.

Справочная информация:

  • CSV является плоским - он не будет сериализовать структурированные данные, поэтому он, вероятно, завершится быстро, хотя и с низкой точностью.

  • XML структурирован - экспорт XML будет сериализованвложенные свойства, и если сами эти свойства имеют вложенные свойства, то вы можете получить достаточно много информации из системы.

Существует предел того, насколько умным может быть сериализатор,и он, вероятно, выполнит это с помощью нескольких последовательных вызовов для каждого объекта, который идет по конвейеру . (Это распространенная проблема при разработке приложений,при сериализации объекта можно извлечь большой граф из слоя данных только для одного объекта.Имейте в виду, что Export-Clixml является сериализатором общего назначения;можно было бы написать один только для сериализации вывода из Get-Process, который может быть оптимизирован для минимизации вызовов вне процесса.)

Я тестировал в pwsh в Windows.Если я передам Get-Process | Export-Clixml processes.xml, то количество объектов, которые я сериализирую в файл, зависит от того, как долго я жду, прежде чем нажать Ctrl-C.На моем слабом корпоративном ноутбуке это порядка секунды на процесс на глубине по умолчанию.

В Powershell в Windows объект ProcessInfo (то, что вы получаете от Get-Process - это оболочка вокруг нативногообъект, который предоставляется через COM. Это дескриптор в .NET для чего-то, что находится за пределами .NET. Для этого прочитайте внепроцессные вызовы - которые намного медленнее, чем вызовы того же процесса.Если бы вы передавали чистые объекты .NET, тогда было бы просто получить вложенные свойства, и все бы быстро завершилось.

Для каждого процесса он собирается в COM, чтобы получить загруженные библиотеки DLL, затемон собирается на COM, чтобы получить потоки ... это дорогие звонки в Windows и, вероятно, тоже в * nix.

Ответ:

Установите глубинуна Export-Clixml.

Если указать глубину 1: Get-Process | Export-Clixml -Depth 1 processes.xml, я получу все запущенные процессы за одну или две секунды. Но я не получу полную сериализацию вложенных свойств.

В общем serialisation - это компромисс между верностью и производительностью.

Редактировать 2019-03-19

Я вижу, вы добавилиуточняющий комментарий - вы хотите получить XML, а не CLI XML.

Export-Clixml (и связанный с ним [System.Management.Automation.PSSerializer]::Serialize()) выходной XML, который является действительным , но сильно оптимизирован для сериализации Powershell,Если вы отправляете данные в какую-либо общую службу, вы, скорее всего, получите пробег от ConvertTo-Xml, что дает вам более типичную структуру документа для межпроцессного обмена.

> $Xml = Get-Process a* | ConvertTo-Xml -Depth 4      # name begins with 'a'
> $Xml

xml                            Objects
---                            -------
version="1.0" encoding="utf-8" Objects


> $Xml.Save('C:\dev\processes.xml')
> Get-Content 'C:\dev\processes.xml' -TotalCount 10
<?xml version="1.0" encoding="utf-8"?>
<Objects>
  <Object Type="System.Diagnostics.Process">
    <Property Name="Name" Type="System.String">AgentUI</Property>
    <Property Name="SI" Type="System.Int32">1</Property>
    <Property Name="Handles" Type="System.Int32">347</Property>
    <Property Name="VM" Type="System.Int64">2204067930112</Property>
    <Property Name="WS" Type="System.Int64">36667392</Property>
    <Property Name="PM" Type="System.Int64">50425856</Property>
    <Property Name="NPM" Type="System.Int64">29800</Property>
...