PDA

Показать полную графическую версию : вывод значения свойства Описание msp файла


specialist
26-03-2018, 22:20
всем привет!

возникла необходимость выдергивать значение свойства из msp файлов обновлений для ms office - название обновления с номером KB

благодарю Pasha_ZZZ за реализацию задачи!

запускаю командный файл сл. содержания

@Echo Off
color 0B
mode con:cols=100 lines=30
Title Установка обновлений для Microsoft Office 2010
for /f %%i in ('dir /b /O-s Updates\*.msp') do (Call :SetupUpd %%i)

:SetupUpd
for /f "tokens=*" %%a in ('cscript description.vbs //B //NoLogo Updates\%1') do set "MSPName=%%a"
echo Устанавливается %MSPName%
Updates\%1 /qn /norestart
if %errorlevel% neq 0 Echo %1 installation error >>"%temp%\MSO_Update_Error_Log.txt"
GoTo :EOF

и рядом файл description.vbs сл. содержания

Const MSIOPENDATABASEMODE_PATCHFILE = 32
Set oMsi = CreateObject("WindowsInstaller.Installer")
Set msp = oMsi.OpenDatabase(WScript.Arguments(0),MSIOPENDATABASEMODE_PATCHFILE)
Set qView = msp.OpenView("SELECT `Property`,`Value` FROM MsiPatchMetadata WHERE `Property`='Description'")
qView.Execute : Set record = qView.Fetch()
WScript.StdOut.WriteLine record.StringData(2)


вывод получается такой:

Устанавливается Update for Microsoft Outlook 2010 (KB4018314) 32-Bit Edition
Устанавливается Update for Microsoft SharePoint Workspace 2010 (KB2878231) 32-Bit Edition
Устанавливается Service Pack 2 for Microsoft Office 2010 (KB2687455) 32-Bit Edition
Устанавливается Service Pack 2 for Microsoft Visio 2010 (KB2687468) 32-Bit Edition
Устанавливается Security Update for Microsoft Office 2010 (KB3203468) 32-Bit Edition

Serguei Kouzmine
27-03-2018, 06:27
про MSO не пробовал но вот вам может помочь

пример из https://blogs.technet.microsoft.com/pstips/2015/02/22/filtering-files-by-their-metadata-extended-properties/


```
# origin https://blogs.technet.microsoft.com/pstips/2015/02/22/filtering-files-by-their-metadata-extended-properties/

function Get-FileMetaData {


[CmdletBinding()]
param(
[Parameter(Mandatory = $true,
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true)]
[Alias('FullName', 'PSPath')]
[string[]]$Path
)

begin {
$oShell = New-Object -ComObject Shell.Application
}

process {
$Path | ForEach-Object {

if (Test-Path -Path $_ -PathType Leaf) {

$FileItem = Get-Item -Path $_

$oFolder = $oShell.Namespace($FileItem.DirectoryName)
$oItem = $oFolder.ParseName($FileItem.Name)

$props = @{}

0..287 | ForEach-Object {
$ExtPropName = $oFolder.GetDetailsOf($oFolder.Items, $_)
$ExtValName = $oFolder.GetDetailsOf($oItem, $_)

if (-not $props.ContainsKey($ExtPropName) -and
($ExtPropName -ne '')) {
$props.Add($ExtPropName, $ExtValName)
}

}

New-Object PSObject -Property $props
}
}

}

end {
$oShell = $null
}
}


```



пример использования -

```
. .\example.ps1
Get-FileMetaData -path 'C:\Windows\Installer\2ccc495.msp' |
select-object -property name,'Program Name','Item Type','Comments','Title','Subject' |format-list


Name : 2ccc495.msp
Program name : Windows Installer XML - SOC (3.6.3520.0)
Item type : Windows Installer Patch
Comments : KB2707250
Title : KB2707250
Subject : Hotfix for Microsoft Visual Studio 2012 - KB2707250

```

поскольку это `Shell.Application` то можно перевисать на VBS или MS Jscript

specialist
27-03-2018, 10:26
на одном ресурсе подсказали такое решение
sFilename = "2f1f33.msp"
sFolderPathspec = "C:\Windows\Installer"

Set objShell = CreateObject ("Shell.Application")
Set objFolder = objShell.Namespace(sFolderPathspec)

File_description = objFolder.GetDetailsOf(objFolder.Parsename(sFileName), 21)
wscript.echo File_description
проверил - работает
осталось теперь сообразить как это пнуть в цикл перебора к установке всех файлов в папке updates из командного файла с выводом имен...




© OSzone.net 2001-2012