none
Помогите разобраться со скриптом

    Вопрос

  • Получение информации о характеристиках компьютеров в домене

    При запуске скрипта мне просто выводится первый закомментированный абзац  и больше ничего, файл не создается и другое не пишет:

    <# Get-CompsProperties.ps1 PowerShell 20101221 ShS http://shserg.ru
     
    .Synopsys
        Получаем всевозможные данные о компьютерах в организации и сохраняем их в CSV-файле отчета
     
        Get-CompsProperties.ps1 [-SearchRoot <string>] [-SearchScope <string>]
     
    .Parameter
        SearchRoot -    задает корневой контейнер, с которого будет начат поик учетных записей компьютеров,
                        подлежащих опросу
                        Если не задано иное, то по умолчанию принимает значение "$(([ADSI]"LDAP://rootDSE").rootDomainNamingContext)",
                        которое равно DN корневого домена леса.
     
        SearchScope -   область поиска, может принимать одно из 3х возможных значений:
                        'Base'     -    ограничивает область поиска базовым объектом (SearchRoot)
                        'OneLevel' -    поиск только прямых потомков базового объекта (SearchRoot),
                                        за исключением самого базового объекта
                        'Subtree' -     поиск по всему поддереву, начиная с базового объекта (SearchRoot),
                                        включая сам базовый объект
                        Если не задано иное, то по умолчанию принимает значение 'Subtree'
        ReportFileName -полное имя файла отчета
    #>

    Подскажите пожалуйста где почитать вот про этот параметр:

    Quest.ActiveRoles.ArsPowerShellSnapIn.Data.IdentityParameter]

    ЛИСТИНГ

    <# Get-CompsProperties.ps1 PowerShell 20101221 ShS http://shserg.ru
     
    .Synopsys
        Получаем всевозможные данные о компьютерах в организации и сохраняем их в CSV-файле отчета
     
        Get-CompsProperties.ps1 [-SearchRoot <string>] [-SearchScope <string>]
     
    .Parameter
        SearchRoot -    задает корневой контейнер, с которого будет начат поик учетных записей компьютеров,
                        подлежащих опросу
                        Если не задано иное, то по умолчанию принимает значение "$(([ADSI]"LDAP://rootDSE").rootDomainNamingContext)",
                        которое равно DN корневого домена леса.
     
        SearchScope -   область поиска, может принимать одно из 3х возможных значений:
                        'Base'     -    ограничивает область поиска базовым объектом (SearchRoot)
                        'OneLevel' -    поиск только прямых потомков базового объекта (SearchRoot),
                                        за исключением самого базового объекта
                        'Subtree' -     поиск по всему поддереву, начиная с базового объекта (SearchRoot),
                                        включая сам базовый объект
                        Если не задано иное, то по умолчанию принимает значение 'Subtree'
        ReportFileName -полное имя файла отчета
    #>
    #================================================================================================================
    param([Quest.ActiveRoles.ArsPowerShellSnapIn.Data.IdentityParameter]$SearchRoot="$(([ADSI]"LDAP://rootDSE").rootDomainNamingContext)",`
            [DirectoryServices.SearchScope]$SearchScope="Subtree", $ReportFileName)
    #================================================================================================================
    <###############################################################################
     
     Function Show-Help.    Выводит на экран первый блочный коментарий скрипта,
                            заданного в качестве параметра вызова.
     
    .Parameter <ScriptFullName>
        Полное имя скрипта, чей первый блочный коментарий будет выведен на экран.
     
    #################################################################################>
    Function Show-Help ($ScriptFullName){
        if ($ScriptFullName) {
            $IsHelpLine=$false
            switch -file $ScriptFullName {
                {$_ -match "<#"}     {Write-Host $_;$IsHelpLine=$true;continue}
                {$_ -match "#>"}     {Write-Host $_;$IsHelpLine=$false;break}
                {$IsHelpLine}        {Write-Host $_;}
            }
        }
    }
    <###############################################################################
    .Function Get-CompProerties
     
    .Synopsis
    Функция Get-CompProperties предназначена для получения информации о характеристиках компьютера.
     
    .Parameters
        CompName         - имя исследуемого компьютера
     
        PhisDrvCountEval - предполагоемое максимально возможное количество HDD
                Оценка количества физических дисков
                (предполагаемый максимум количества физмческих дисков в исследуемой системе)
                Именно такое количество полей будет отведено в объект-компьютер для хранения информации о жестких дисках
                (даже если этих дисков реально окажется меньше или больше этого нашего предположения)
     
    #################################################################################>
    Function Get-CompProerties ($CompName=".", $PhisDrvCountEval=2) {
        #
        #Создаем объект с полями, в котором будем хранитть свойства опрашиваемог окомпьютера
        $objComp=New-Object PSObject
        #Добавляем поля к объекту
        $objComp|Add-Member NoteProperty CompName -Value $null
        $objComp|Add-Member NoteProperty OSVersion -Value $null
        $objComp|Add-Member NoteProperty SPVersion -Value $null
        $objComp|Add-Member NoteProperty SystemDrive -Value $null
        $objComp|Add-Member NoteProperty InstallDate -Value $null
        $objComp|Add-Member NoteProperty DEPPol -Value $null
        $objComp|Add-Member NoteProperty PageFileInitSize -Value $null
        $objComp|Add-Member NoteProperty PageFileMaxSize -Value $null
        $objComp|Add-Member NoteProperty TotalPhysicalMemory -Value $null
        $objComp|Add-Member NoteProperty CPUName -Value $null
        $objComp|Add-Member NoteProperty PhisicalDrivesCount -Value $null
        #Добавмим столько полей для хранения информации о HDD, сколько мы
        #предполагали сохранить.
        for ($i=1;$i -le $PhisDrvCountEval;$i++) {
            Invoke-Expression $('$objComp|Add-Member NoteProperty PhisicalDrive'+ $i + 'Size -Value $null')
            Invoke-Expression $('$objComp|Add-Member NoteProperty PhisicalDrive'+ $i + 'Model -Value $null')
            Invoke-Expression $('$objComp|Add-Member NoteProperty PhisicalDrive'+ $i + 'Partitions -Value $null')
        }
        $objComp|Add-Member NoteProperty SysDrvSize -Value $null
        $objComp|Add-Member NoteProperty SysDrvFreeSpace -Value $null
        $objComp|Add-Member NoteProperty VideoControllerName -Value $null
        $objComp|Add-Member NoteProperty VideoControllerRAM -Value $null
        $objComp|Add-Member NoteProperty Chipset -Value $null
        $objComp|Add-Member NoteProperty SMBIOSBIOSVersion -Value $null
        $objComp|Add-Member NoteProperty BIOSManufacturer -Value $null
        $objComp|Add-Member NoteProperty BIOSName -Value $null
        $objComp|Add-Member NoteProperty BIOSSerialNumber -Value $null
        $objComp|Add-Member NoteProperty BIOSVersion -Value $null
        #
        #======================= Здесь начинаем заполнять поля объекта ==========================
        #
        #Имя компьютера
        $OS=gwmi win32_OperatingSystem -ComputerName $CompName -ErrorAction Stop
        $objComp.CompName=$OS.CSName
        #Версия OS И ServicePack'а
        $objComp.OSVersion=$OS.Version
        $objComp.SPVersion=$OS.ServicePackMajorVersion
        #Дата/время установки ОС
        $objComp.InstallDate=([WMI]'').ConvertToDateTime($OS.InstallDate)
        #Политика DEP
        $objComp.DEPPol=$OS.DataExecutionPrevention_SupportPolicy
        #Имя SystemDrive
        $objComp.SystemDrive=$OS.SystemDrive
        #Минимальный/Максимальный размеры файла подкачки
        $PageFile=gwmi win32_pagefilesetting  -ComputerName $CompName
        $objComp.PageFileInitSize=$PageFile.InitialSize
        $objComp.PageFileMaxSize=$PageFile.MaximumSize
        #Доступный объем ОЗУ
        $objComp.TotalPhysicalMemory=[math]::Round((gwmi Win32_ComputerSystem  -ComputerName $CompName -ErrorAction Stop).TotalPhysicalMemory/1gb,3)
        #Название ЦПУ
        $objComp.CPUName=(gwmi Win32_Processor  -ComputerName $CompName -ErrorAction Stop).Name
        if ($objComp.CPUName) {$objComp.CPUName=$objComp.CPUName.Trim()}
        #Информация о физических дисках
        $PhisicalDrives=@(gwmi win32_diskdrive -ComputerName $CompName -ErrorAction Stop| select Model,Size, Partitions)
        $objComp.PhisicalDrivesCount=$PhisicalDrives.Count
        #Заполним поля информацией о HDD
        for ($i=1;$i -le [math]::min($PhisDrvCountEval, $PhisicalDrives.Count);$i++) {
            Invoke-Expression $('$objComp.PhisicalDrive'+ $i + 'Model=$PhisicalDrives[$i-1].Model')
            Invoke-Expression $('$objComp.PhisicalDrive'+ $i + 'Size=[math]::Round($PhisicalDrives[$i-1].Size/1gb, 3)')
            Invoke-Expression $('$objComp.PhisicalDrive'+ $i + 'Partitions=$PhisicalDrives[$i-1].Partitions')
        }
        #Информация о системном разделе...
        $SystemDriveInfo=gwmi Win32_LogicalDisk -ComputerName $CompName -ErrorAction Stop|?{$_.DeviceID -eq $OS.SystemDrive}
        ##...размер и...
        $objComp.SysDrvSize=[math]::Round($SystemDriveInfo.Size/1gb,3)
        ##...свободное место
        $objComp.SysDrvFreeSpace=[math]::Round($SystemDriveInfo.FreeSpace/1gb,3)
        #Информация о видеоадаптере
        $VideoController=gwmi Win32_VideoController -ComputerName $CompName -ErrorAction Stop
        $objComp.VideoControllerName=$VideoController.Name
        $objComp.VideoControllerRAM=[math]::Round($VideoController.AdapterRAM/1mb,3)
        #Информация о Chipset'е
        #(исходим из предположения, что все опрашиваемые компьюторы имееют мат плату на chipset'ах Intel
        #и на них установлены драйвера Inf-updates)
        $Chipset= gwmi Win32_PnPEntity -ComputerName $CompName -ErrorAction Stop| Out-String -Stream|
        Select-String ".*intel.*\s([^\d/\s]{0,2}\d{2,5}[^\d/\s]{0,2})/"| select -First 1
        if ($Chipset) {$ObjComp.Chipset=$Chipset.Matches[0].Groups[1].Value}
        #Информация о BIOS
        $BIOS=gwmi Win32_BIOS -ComputerName $CompName -ErrorAction Stop
        $objComp.SMBIOSBIOSVersion=$BIOS.SMBIOSBIOSVersion
        $objComp.BIOSManufacturer=$BIOS.Manufacturer
        $objComp.BIOSName=$BIOS.Name
        $objComp.BIOSSerialNumber=$BIOS.SerialNumber
        $objComp.BIOSVersion=$BIOS.Version
        #Вовращем objComp, в качестве результата работы функции
        $objComp
    }
    #
    #================= Точка входа скрипта ==================================
    cls
    if (($ReportFileName) -and (Test-Path ($ReportFileName|Split-Path))) {
        Write-Host $(Get-Date)
        #
        $VerbosePreference = "Continue"
        #Папка, из которой был запущен скрипт
        $ScriptPath=Split-Path $MyInvocation.MyCommand.Path
        #Полное имя файла-отчета
        #$ReportFileName="$ScriptPath\1.csv"
        #Если существует старый отчет, то...
        if (Test-Path $ReportFileName) {
            #...загрузим данные из него в хэш-таблицу
            $ReportHash=import-csv $ReportFileName -UseCulture| group -AsHashTable CompName
        }
        #Создадим пустой массив, в который будем собирать информацию об опрашиваемых компьютерах
        $DomainCompsProps=@()
        #аналогично, создаем массив для формирования лог-файла выполнения скрипта
        $PollLog=@()
        #Зададим корневое OU, с которого будет начат поиск компьютеров
        #$SearchRoot="OU=MySubOU,OU=MyOU,OU=Workstations,DC=domain,DC=local"
        #Выбираем из заданной ветки все незаблокированные компьютеры
        $Comps = Get-QADComputer -IncludedProperties lastLogontimeStamp -ErrorAction SilentlyContinue -SearchRoot $SearchRoot -SearchScope $SearchScope -SizeLimit 0 |
            select name, lastLogontimeStamp, Description, whenCreated, @{Name="Disabled"; Exp={$_.useraccountcontrol -band 2}}|
            ?{$_.Disabled -eq 0}
        #Перебираем все компьютеры и получаем их свойства
        foreach ($Comp in $Comps) {
            #создаем объект для сбора информации о процессе опроса компьютера (логирование опроса)
            #и заполняем его поля значениями
            $objPol=New-Object PSObject
            $objPol|Add-Member NoteProperty CompName -Value $Comp.Name
            $objPol|Add-Member NoteProperty Description -Value $Comp.Description
            $objPol|Add-Member NoteProperty ErrorNumber -Value 0
            $objPol|Add-Member NoteProperty whenCreated -Value $Comp.whenCreated
            $objPol|Add-Member NoteProperty lastLogonTimeStamp -Value $Comp.lastLogontimeStamp
            $objPol|Add-Member NoteProperty PollDate -Value (Get-Date)
            #
            #
            $PollingError=$false
            if (Test-Connection $Comp.Name -Count 1 -Quiet) {
                try {
                    #Write-Host "CompName=",$Comp.Name, "  CompDescription=", $Comp.Description #, "  LoggedonUser=", $LoggedonUserName
                    Write-Host "$("CompName= {0,-15} CompDescription= {1,-20}" -f $Comp.Name, $Comp.Description)"
                    $CurCompProps=Get-CompProerties -CompName $Comp.Name
                    #Добавим еще несколько полей к объекту со свойствами компьютера
                    ## Добавляем Description
                    $CurCompProps| Add-Member NoteProperty Description -Value $Comp.Description
                    ## Добавляем lastLogonTimeStamp
                    $CurCompProps| Add-Member NoteProperty lastLogonTimeStamp -Value $Comp.lastLogontimeStamp
                    ## Добавляем whenCreated
                    $CurCompProps| Add-Member NoteProperty whenCreated -Value $Comp.whenCreated
                    ##Добавляем дату сбора информации
                    $CurCompProps| Add-Member NoteProperty ReportDate -Value (Get-Date)
                    #$DomainCompsProps[$CurCompProps.CompName]=$CurCompProps
                    $DomainCompsProps+=$CurCompProps
                }
                catch {
                    $PollingError=$true
                    #если компьютер пингуется, но его не удалось опросить, то в лог помещаем Error #5
                    $objPol.ErrorNumber=5
                    Write-Verbose "$("Ошибка доступа к компьютеру CompName= {0,-15}  CompDescription= {1,-20} LastLogonTimeStamp= {2,8}" -f $Comp.Name, $Comp.Description, $Comp.lastLogontimeStamp.ToString("yyyyMMdd"))"
                }
            }
            else {
                $PollingError=$true
                #если компьютер не пингуется, то в лог идет Error #1
                $objPol.ErrorNumber=1
                Write-Verbose "$("Компьютер CompName= {0,-15}  CompDescription= {1,-20} не пингуется. LastLogonTimeStamp= {2,8}" -f $Comp.Name, $Comp.Description, $Comp.lastLogontimeStamp.ToString("yyyyMMdd"))"
            }
            #Если произошла ошибка во время опроса компьютера,
            #а в старом отчете информация об этом компьютере имеется...
            if ($PollingError -and $ReportHash) {
                if ($ReportHash[$Comp.Name]) {
                   #..., то добавим эту информацию к формируемому отчету
                   $DomainCompsProps+=$ReportHash[$Comp.Name]
                }
            }
            $PollLog+=$objPol
        }
        if ($DomainCompsProps) {
            Write-Host "Выгружаем результаты в файл отчета.."
            # Выгружаем результат в файл
            $DomainCompsProps| Export-Csv -Path $ReportFileName -UseCulture #-Delimiter ";"
            Write-Host $(Get-Date)
        }
        else {
            Write-Host "Данных для формирования отчета собрать не удалось!"
        }
        #Если лог-объект не пустой, то выгружаем его в лог-файл
        if ($PollLog) {
            $PollLog| Export-Csv -Path ((Split-Path $ReportFileName)+"\log.csv") -UseCulture
        }
        Write-Host "Работа завершена!"
    }
    else {
        #Выводим на экран первый блочный комментарий этого скрипта в качестве справки
        Show-Help $MyInvocation.MyCommand.Path
    }


    ывмывм

    4 февраля 2019 г. 12:55

Ответы

  • вам в скрипт нужно подать -reportfilename без которого скрипт выводит справку

    при этом файл репорта может не существовать, а вот каталог должен быть

    пример выполнения .\script.ps1 -reportfilename c:\temp\filereport.txt

    при этом c:\temp должен существовать


    The opinion expressed by me is not an official position of Microsoft

    • Изменено Vector BCOModerator 4 февраля 2019 г. 15:50
    • Помечено в качестве ответа BkmzFIL 6 февраля 2019 г. 4:57
    4 февраля 2019 г. 15:47
    Модератор

Все ответы

  • вам в скрипт нужно подать -reportfilename без которого скрипт выводит справку

    при этом файл репорта может не существовать, а вот каталог должен быть

    пример выполнения .\script.ps1 -reportfilename c:\temp\filereport.txt

    при этом c:\temp должен существовать


    The opinion expressed by me is not an official position of Microsoft

    • Изменено Vector BCOModerator 4 февраля 2019 г. 15:50
    • Помечено в качестве ответа BkmzFIL 6 февраля 2019 г. 4:57
    4 февраля 2019 г. 15:47
    Модератор
  • Читать про тип этого параметра вам не нужно, потому что реально он принимает строку с Distingushed Name контейнера, с которого начинать поиск : т.е. отлично преобразуется в нужный тип из строки с Distingushed Name (это видно из того, как создается значение по по умолчанию - Distinguished name домена).

    PS А со скрипта я несколько удивляюсь: там совершенно непонятно зачем используется Quest'овский аналог команды из модуля ActiveDirectory и COM-объект ADSI - хотя всё нужное делается средствами стандартного модуля ActiveDirectory. Разве что, скрипт был написан в те древние времена, ещё когда этого модуля не было...


    Слава России!

    4 февраля 2019 г. 21:07
  • Разве что, скрипт был написан в те древние времена, ещё когда этого модуля не было...


    Слава России!

    "Posted by  on 20 January 2011, 10:22 pm"

    так и есть... тогда класический ад модуль был убогий



    • Изменено Svolotch 5 февраля 2019 г. 8:27
    5 февраля 2019 г. 8:27
  • вам в скрипт нужно подать -reportfilename без которого скрипт выводит справку

    при этом файл репорта может не существовать, а вот каталог должен быть

    пример выполнения .\script.ps1 -reportfilename c:\temp\filereport.txt

    при этом c:\temp должен существовать


    The opinion expressed by me is not an official position of Microsoft


    Спасибо, странно то что я с параметром -reportfilename запускал скрипт, но папка была на рабочем столе, не хотел запускаться, всяко разно испробовал, создал на диске C папку temp запустил с параметром как у вас и заработало =\

    • Изменено BkmzFIL 6 февраля 2019 г. 4:58
    6 февраля 2019 г. 4:54
  • Читать про тип этого параметра вам не нужно, потому что реально он принимает строку с Distingushed Name контейнера, с которого начинать поиск : т.е. отлично преобразуется в нужный тип из строки с Distingushed Name (это видно из того, как создается значение по по умолчанию - Distinguished name домена).

    PS А со скрипта я несколько удивляюсь: там совершенно непонятно зачем используется Quest'овский аналог команды из модуля ActiveDirectory и COM-объект ADSI - хотя всё нужное делается средствами стандартного модуля ActiveDirectory. Разве что, скрипт был написан в те древние времена, ещё когда этого модуля не было...


    Слава России!


    Можете направить на путь истинный?  что почитать в этом направлении, хотел бы изучить ps для автоматизации
    6 февраля 2019 г. 4:55
  • вам в скрипт нужно подать -reportfilename без которого скрипт выводит справку

    при этом файл репорта может не существовать, а вот каталог должен быть

    пример выполнения .\script.ps1 -reportfilename c:\temp\filereport.txt

    при этом c:\temp должен существовать


    The opinion expressed by me is not an official position of Microsoft


    и еще вопрос, для запуска опроса определенного контейнера в AD как правильно указать параметр "-SearchRoot"   OU=test_PC_1c,OU=Office_PC,DC=mydomain   , в папке Office_PC лежит папка test_PC_1c
    6 февраля 2019 г. 5:14
  • вам в скрипт нужно подать -reportfilename без которого скрипт выводит справку

    при этом файл репорта может не существовать, а вот каталог должен быть

    пример выполнения .\script.ps1 -reportfilename c:\temp\filereport.txt

    при этом c:\temp должен существовать


    The opinion expressed by me is not an official position of Microsoft


    и еще вопрос, для запуска опроса определенного контейнера в AD как правильно указать параметр "-SearchRoot"   OU=test_PC_1c,OU=Office_PC,DC=mydomain   , в папке Office_PC лежит папка test_PC_1c

    Нашел в справке :

    PS C:\Users\user\Desktop\ps> .\CompsProperties.ps1 -SearchRoot 'mydomain/Office_PC/test_PC_1c' -reportfilename c:\temp\filereport.csv
    

    6 февраля 2019 г. 5:27

  • Можете направить на путь истинный?  что почитать в этом направлении, хотел бы изучить ps для автоматизации

    у мс есть хороший официальный курс по powershell (платный, но базу дает неплохую)

    есть так же несколько книг таких как Powershell in action и Powershell cookbook - где первая представляет из себя туториал по языку, а вторая на примерах задач (часто не тривиальных) показывает их решение.

    при наличии базового понимания есть специфические курсы на microsoftvirtualacademy. а так же не стоит забывать про справку, где можно сначала найти нужный коммандлет через help *item*, a потом прочесть справку по нужному из них help get-item -full


    The opinion expressed by me is not an official position of Microsoft

    6 февраля 2019 г. 6:08
    Модератор

  • и еще вопрос, для запуска опроса определенного контейнера в AD как правильно указать параметр "-SearchRoot"   OU=test_PC_1c,OU=Office_PC,DC=mydomain   , в папке Office_PC лежит папка test_PC_1c
    Проще всего не мучиться, забивая вручную, а в AD Users&Computers включить режим просмотра Advanced, в свойствах контейнера (OU) зайти в Attribute Editor и скопировать значение его атрибута distinguishedName (для этого нужно перейти в режим редактирования атрибута)

    Слава России!

    6 февраля 2019 г. 18:47

  • Можете направить на путь истинный?  что почитать в этом направлении, хотел бы изучить ps для автоматизации

    у мс есть хороший официальный курс по powershell (платный, но базу дает неплохую)

    есть так же несколько книг таких как Powershell in action и Powershell cookbook - где первая представляет из себя туториал по языку, а вторая на примерах задач (часто не тривиальных) показывает их решение.

    при наличии базового понимания есть специфические курсы на microsoftvirtualacademy. а так же не стоит забывать про справку, где можно сначала найти нужный коммандлет через help *item*, a потом прочесть справку по нужному из них help get-item -full


    The opinion expressed by me is not an official position of Microsoft

    Можете подсказать как сделать, чтоб при выгрузке в форма csv все записывалось не в один столбец а в раздельные :

    Get-WmiObject Win32_PhysicalMemory -ComputerName dell-it | Select-Object BankLabel, @{Name="Capacity, GB"; Expression={$_.Capacity/1GB}}, Manufacturer, SMBIOSMemoryType | Export-Csv  -NoType c:\temp\result.csv
    хотелось бы собрать информацию об оперативной памяти, в дальнейшем сделать массив который опрашивает все ПК в домене

    7 февраля 2019 г. 8:53

  • Можете подсказать как сделать, чтоб при выгрузке в форма csv все записывалось не в один столбец а в раздельные :

    Get-WmiObject Win32_PhysicalMemory -ComputerName dell-it | Select-Object BankLabel, @{Name="Capacity, GB"; Expression={$_.Capacity/1GB}}, Manufacturer, SMBIOSMemoryType | Export-Csv  -NoType c:\temp\result.csv
    хотелось бы собрать информацию об оперативной памяти, в дальнейшем сделать массив который опрашивает все ПК в домене

    если вы про отображение то все зависит от того чем вы этот csv открываете

    например ексель может правильно отобразить если зайти в закладку Data Разбивка по столбцам с разделителем запятая


    The opinion expressed by me is not an official position of Microsoft

    7 февраля 2019 г. 9:55
    Модератор

  • Можете подсказать как сделать, чтоб при выгрузке в форма csv все записывалось не в один столбец а в раздельные :

    Get-WmiObject Win32_PhysicalMemory -ComputerName dell-it | Select-Object BankLabel, @{Name="Capacity, GB"; Expression={$_.Capacity/1GB}}, Manufacturer, SMBIOSMemoryType | Export-Csv  -NoType c:\temp\result.csv
    хотелось бы собрать информацию об оперативной памяти, в дальнейшем сделать массив который опрашивает все ПК в домене

    если вы про отображение то все зависит от того чем вы этот csv открываете

    например ексель может правильно отобразить если зайти в закладку Data Разбивка по столбцам с разделителем запятая


    The opinion expressed by me is not an official position of Microsoft


    Спасибо
    8 февраля 2019 г. 5:21