Powershell: как вывести таблицу в файл журнала
Я пытаюсь создать сценарий для своей работы, и мне нужно прочитать файл xml, чтобы проверить, есть ли дублирующиеся параметры. Пока я могу вывести таблицу, но мне не удалось экспортировать ее в какой-либо файл (журнал, csv и т. д.).
Идея состоит в том, чтобы запустить сценарий и получить эту информацию для многих удаленных серверов.
Это мой текущий прогресс.
$SectionName = 'np'
$path = "S:\Docker\NP6\Volumes\smartupdate\config\SmartUpdateLocal.xml"
[xml] $xml = Get-Content $path
$param = $xml.SelectSingleNode("//Section[@name='$SectionName']")
$table = $param.Parameter
$table
И таблицу можно увидеть:
Но поскольку я буду запускать этот скрипт для тысячи серверов, я хотел бы экспортировать что-то вроде:
---------Server A------------
Name Value
ena.. true
base.. 0
sto.. 22592
ena.. EAI
---------Server B------------
Name Value
ena.. true
base.. 0
sto.. 22592
ena.. EAI
Формат XML
<SmartUpdate>
<Settings>
<Section name="np">
<Parameter name="enableStatusFileCreation" value="true" />
<Parameter name="baseStatusCode" value="0" />
<Parameter name="storeId" value="43001" />
<Parameter name="enableTransportMechanismAndPackage" value="true"/>
<Parameter name="statusTransportMechanism" value="EAI" />
</Section>
</Settings>
</SmartUpdate>
Также я зацикливаю удаленные серверы
$computerList = Get-Content $DeviceListFilePath
foreach($computer in $computerList)
{
$SectionName = 'np'
Write-Host "OPENING XML FILE" -ForegroundColor Yellow
$path = "\\$server_ip\$FileName"
[xml] $xml = Get-Content $path
$param = $xml.SelectSingleNode("//Section[@name='$SectionName']")
Спасибо вам за помощь.
1 ответ
Вот что я бы порекомендовал вам сделать, чтобы получить вывод, который вы можете экспортировать в CSV, и его очень легко сортировать и фильтровать:
$SectionName = 'np'
$result = foreach($computer in Get-Content $DeviceListFilePath) {
Write-Host "OPENING XML FILE" -ForegroundColor Yellow
# Unclear where `$server_ip` and `$FileName` are coming from,
# assuming they're valid values to construct the UNC Path
# or that you meant: `\\$computer\$FileName`
$path = "\\$server_ip\$FileName"
$xml = [xml]::new()
$xml.Load($path)
# This Dictionary is used to construct the output.
$out = [ordered]@{
Server = $computer
}
$xml.SelectSingleNode("//Section[@name='$SectionName']").Parameter |
ForEach-Object { $out[$_.name] = $_.Value }
[pscustomobject] $out
}
$result | Export-Csv path\to\export.csv -NoTypeInformation
Поскольку у меня нет доступа к вашим путям UNC, я бы показал, как будет выглядеть вывод, используя XML, представленный в вопросе, с двумя серверами:
$SectionName = 'np'
$result = foreach($computer in 'server A', 'server B') {
# the example XML is stored in my current directory
$path = '.\file.xml'
$xml = [xml]::new()
$xml.Load($path)
$out = [ordered]@{
Server = $computer
}
$xml.SelectSingleNode("//Section[@name='$SectionName']").Parameter |
ForEach-Object { $out[$_.name] = $_.Value }
[pscustomobject] $out
}
$result
Вывод из этого примера будет выглядеть так:
Server : server A
enableStatusFileCreation : true
baseStatusCode : 0
storeId : 43001
enableTransportMechanismAndPackage : true
statusTransportMechanism : EAI
Server : server B
enableStatusFileCreation : true
baseStatusCode : 0
storeId : 43001
enableTransportMechanismAndPackage : true
statusTransportMechanism : EAI
И как CSV:
PS \> $result | ConvertTo-Csv
"Server","enableStatusFileCreation","baseStatusCode","storeId","enableTransportMechanismAndPackage","statusTransportMechanism"
"server A","true","0","43001","true","EAI"
"server B","true","0","43001","true","EAI"