Как записать процессы в файл XML с помощью Powershell?

Экспорт процессов в файл 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.ps1pi.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 без дополнительных шагов.)

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

Смотрите также:

Какова ваша общая цель? Просто вариант XML файла CSV? Или вы бы предпочли делать что-то с System.Diagnostics.Process объектами, которые вы получаете от Get-Process?

Tomalak 17.03.2019 19:28

Ну, я действительно просто искал надежный способ сгенерировать xml, @Tomalak. Но данные мог безусловно имеют значение.

Thufir 18.03.2019 01:57

Привет, я принял ваш вопрос за чистую монету, но если вы не привязаны к конкретному формату CLI XML, посмотрите мое редактирование, которое, я думаю, может помочь. Спасибо, что привели в порядок и ваш вопрос!

FSCKur 20.03.2019 00:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
221
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Edit - At first, I answered the question as originally presented, around "why am I having issues with Export-Clixml, but see my edit further down for a solution involving 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, то я получу все запущенные процессы в течение секунды или двух. Но я не получаю полную сериализацию вложенных свойств.

В общем, сериализация — это компромисс между точностью и производительностью.

Edit 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>

Интересно. Если вы вложите его на глубину один, вы получите результаты обратно. Будет ли тогда возможно запускать каждую глубину как отдельную итерацию, чтобы файл генерировался для уровня: один, два и т. д.? Но можно ли это вообще использовать? Придется обратно сшивать....

Thufir 18.03.2019 01:59

Это было бы пустой тратой времени, если бы оно вам действительно не нужно, и не решило бы основную проблему (если я прав). Можете ли вы провести некоторые эксперименты, чтобы увидеть, влияет ли это на производительность? Попробуйте Get-Process | select -first 1 | Export-Clixml processes.xml и посмотрите, завершится ли это в течение, скажем, 15 секунд. (приемлемая производительность IMO будет 200-500 мс). Также попробуйте Get-Process | select -first 1 | ConvertTo-Json для сравнения. Вы также можете попробовать передать через select -Property # properties that you care about, чтобы увидеть, поможет ли это. Не исключено, что вы нашли ошибку, это может сузить круг поиска.

FSCKur 18.03.2019 20:11

Другие вопросы по теме