Я пытаюсь отобразить данные в документе Excel, где в столбце A отображается имя сервера, а в столбце B отображается версия .NET. Я столкнулся с проблемой экспорта в .csv, потому что он говорит, что путь к файлу не существует. Я хотел бы получить некоторые рекомендации о том, как я могу решить эту проблему и как я могу отображать данные в двух столбцах в Excel.
$Servers =
(
"test"
)
foreach ($Server in $Servers)
{
Invoke-Command -ComputerName $Server -ScriptBlock {
Write-Output "$(hostname)"
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name Version,Release -EA 0 | where { $_.PSChildName -match '^(?!S)\p{L}'} | select PSChildName, Version, Release | Select -ExpandProperty Version | Sort-Object Version | Export-Csv -Path C:\Users\User\Desktop\example.csv
}
@SantiagoSquarzon, я хочу экспортировать на локальный хост
@SantiagoSquarzon. Есть ли лучший способ добавить несколько серверов, чтобы сценарий получил версию .NET для нескольких серверов? Когда я пытаюсь запустить обновленный скрипт, он просто продолжает проходить через каждый сервер и не останавливается.
Может быть, есть более быстрый способ получить .NET-версию компьютера (я имею в виду лучше, чем блок сценария, который у вас уже есть), однако я не уверен в этом конкретно, я только что понял, что допустил ошибку с размещением Sort-Object
в моем ответ (см. обновление).
@SantiagoSquarzon, не обязательно имея в виду быстрый способ, но я говорю, что сценарий просто зацикливает серверы и не заканчивается, когда я добавляю в сценарий несколько серверов.
Я не вижу ничего плохого в самом коде, возможно, он не может подключиться к некоторым хостам (время ожидания составляет около 2 минут), поэтому это может вызывать задержки. но наверняка цикл foreach
будет намного медленнее
@SantiagoSquarzon, хорошо, когда говорится, что работает над «___», это просто означает, что сценарий все еще работает и еще не завершен, верно?
Да, сэр, дело в том, что, поскольку это работает в параллельно, вы увидите, что «работает над ...» для стольких хостов, сколько есть в $computers
(все одновременно, вероятно, лол)
@SantiagoSquarzon, я понимаю, что ты имеешь в виду. В любом случае, спасибо за объяснение и помощь!!
Конечно, с удовольствием ;)
Основная проблема заключается в том, что вы используете Export-Csv
на удаленных хостах, так как он находится внутри блока сценария Invoke-Command
, и симпатичная ошибка заключается в том, что путь, который вы используете в качестве экспорта, не существует на этих хостах.
Также стоит отметить, что Invoke-Command
может работать параллельно, -ComputerName
, а также -Session
может принимать массив, это устраняет необходимость в цикле foreach
, а также намного быстрее / эффективнее.
Invoke-Command -ComputerName $servers -ScriptBlock {
Write-Host "Working on $($env:COMPUTERNAME)..."
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
Get-ItemProperty -Name Version, Release -EA 0 |
ForEach-Object {
if ($_.PSChildName -notmatch '^(?!S)\p{L}') {
return # skip this
}
[pscustomobject]@{
HostName = $env:COMPUTERNAME
Version = $_.Version
}
} | Sort-Object Version
} -HideComputerName | Select-Object * -ExcludeProperty RunspaceID |
Export-Csv -Path C:\Users\User\Desktop\example.csv -NoTypeInformation
Export-Csv -Path C:\Users\User\Desktop\example.csv
находится внутри скриптового блокаInvoke-Command
, как кажется. Вы хотите экспортировать результат на локальный хост или на удаленный хост?