Как собрать следующий вывод в CSV-файл - PullRequest
0 голосов
/ 21 июня 2019

Мой скрипт собирает MSI-информацию, такую ​​как ProductCode, ProductName, Upgrade Code и т. Д. Я пытаюсь получить всю информацию о том, что в CLI читать экспорт в CSV-файл.

Вот кусок кода, остальное тоже похоже

$Dir =  Get-ChildItem -Path W:\MSIs\*.msi -Recurse

foreach ($item in $Dir) { 

try {
    $windowsInstaller = New-Object -com WindowsInstaller.Installer

    $database = $windowsInstaller.GetType().InvokeMember('OpenDatabase', 'InvokeMethod', $null, $windowsInstaller, @((Get-Item -Path $item).FullName, 0))

    $view = $database.GetType().InvokeMember('OpenView', 'InvokeMethod', $null, $database, ("SELECT Value FROM Property WHERE Property = 'ProductName'"))
    $view.GetType().InvokeMember('Execute', 'InvokeMethod', $null, $view, $null)

    $record = $view.GetType().InvokeMember('Fetch', 'InvokeMethod', $null, $view, $null)

   echo "Product Name"
    Write-Output -InputObject $($record.GetType().InvokeMember('StringData', 'GetProperty', $null, $record, 1))

} catch {
    Write-Error -Message "Product Name" $_.ToString()s

    break
}

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Я должен был сделать что-то довольно похожее, но только с несколькими выбранными свойствами.

В первую очередь я использовал этот сайт Microsoft для получения огромного количества данных из MSI-файлов.

https://gallery.technet.microsoft.com/scriptcenter/Get-all-native-properties-e4e19180

К сожалению, мне не хватало одного свойствав списке, когда мой поиск продолжался, я нашел эту гораздо более простую версию получения информации о файле.

https://devblogs.microsoft.com/scripting/hey-scripting-guy-how-can-i-retrieve-the-subject-property-for-a-msi-file/

Во второй ссылке я создал функцию, которая идеально соответствует моим потребностям - в зависимости отсвойства, которые вам нужны после этой функции, могут быть легко изменены, и после экспорта в массив их легко экспортировать.

Function Get-FileInfo {

<#
    .SYNOPSIS
    Retrieves information from files

    .DESCRIPTION 
    This function uses the WindowInstaller COM object to pull the subject line from an MSI file.

    .EXAMPLE
    Get-FileInfo E:\DownloadDir\MicrosoftIdentityExtensions-64.msi
    Name                        RevNo                                  Size
    ----                        -----                                  ----
    ACS S2S OAuth JWT Extension {6520558F-956F-4388-8C50-58E5557D7519} 252

    .NOTES
    Inspired by this:
    https://devblogs.microsoft.com/scripting/hey-scripting-guy-how-can-i-retrieve-the-subject-property-for-a-msi-file/

#>

Param (
    [parameter( Mandatory = $true ) ][ValidateNotNullOrEmpty()][System.IO.FileInfo]$FilePath
)

Begin {
    If ( $FilePath.Extension -match ".msi" ){
        $com_object    = New-Object -com WindowsInstaller.Installer
        $comproperties = $com_object.SummaryInformation( $FilePath.Fullname )
    }
    $msiproperties = @()
}

Process {
    If ( $FilePath.Extension -match ".msi" ){
        $msiproperties += [PSCustomObject] @{ 
            Name     = ( $comproperties.Property( 3 ) ).TrimEnd() ;
            RevNo    = $comproperties.Property( 9 );
            Creation = $comproperties.Property( 12 );
        }
    }

}

End { 
    Return $msiproperties
}
}

Надеюсь, это поможет

2 голосов
/ 21 июня 2019

Ответ Грэма хорош. Я уже начал писать функцию для экспорта всех свойств в PowerShell, поэтому решил опубликовать ее в любом случае.

Я написал вещь! Он получает все свойства из MSI и просто переводит его в PSCustomObject. Это позволяет вам делать Select-Object на объекте, чтобы получить интересующие вас свойства.

$Dir =  Get-ChildItem -Path C:\MSIs\*.msi -Recurse

function Get-MsiPropertyList  {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]
        $Path
    )

    process {
        $Path | Foreach-Object {
            $item = $_
            $windowsInstaller = New-Object -ComObject WindowsInstaller.Installer
            $database = $windowsInstaller.GetType().InvokeMember('OpenDatabase', 'InvokeMethod', $null, $windowsInstaller, @((Get-Item -Path $item).FullName, 0))

            $view = $Database.GetType().InvokeMember('OpenView', 'InvokeMethod', $null, $Database, ("SELECT Property,Value FROM Property"))
            $view.GetType().InvokeMember('Execute', 'InvokeMethod', $null, $view, $null) | Out-Null
            $record = $view.GetType().InvokeMember('Fetch', 'InvokeMethod', $null, $view, $null)

            $ret = [pscustomobject]@{
                Path = $item
            }

            while ($record -ne $null) {
                $property = $record.GetType().InvokeMember('StringData', 'GetProperty', $null, $record, 1)
                $value = $record.GetType().InvokeMember('StringData', 'GetProperty', $null, $record, 2)        

                $ret | Add-Member -MemberType NoteProperty -Name $property -Value $value

                $record = $view.GetType().InvokeMember('Fetch', 'InvokeMethod', $null, $view, $null)
            }

            Write-Output $ret
        }
    }
}

# Export all properties to a csv
$Dir | Get-MsiPropertyList | Export-Csv -Path C:\MSIs\test.csv -NoTypeInformation

# Export selected properties to a csv
$Dir | Get-MsiPropertyList | Select-Object -Property Path, ProductName, ProductVersion | Export-Csv -Path C:\MSIs\test2.csv -NoTypeInformation

Надеюсь, это поможет. Рыба

...