Экспорт процессов в файл 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, @Tomalak. Но данные мог безусловно имеют значение.
Привет, я принял ваш вопрос за чистую монету, но если вы не привязаны к конкретному формату CLI XML, посмотрите мое редактирование, которое, я думаю, может помочь. Спасибо, что привели в порядок и ваш вопрос!





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 involvingConvertTo-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>
Интересно. Если вы вложите его на глубину один, вы получите результаты обратно. Будет ли тогда возможно запускать каждую глубину как отдельную итерацию, чтобы файл генерировался для уровня: один, два и т. д.? Но можно ли это вообще использовать? Придется обратно сшивать....
Это было бы пустой тратой времени, если бы оно вам действительно не нужно, и не решило бы основную проблему (если я прав). Можете ли вы провести некоторые эксперименты, чтобы увидеть, влияет ли это на производительность? Попробуйте 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, чтобы увидеть, поможет ли это. Не исключено, что вы нашли ошибку, это может сузить круг поиска.
Какова ваша общая цель? Просто вариант XML файла CSV? Или вы бы предпочли делать что-то с
System.Diagnostics.Processобъектами, которые вы получаете отGet-Process?