Question Variable fichier .inf

Plus d'informations
il y a 5 ans 6 mois #19297 par lepatriot
Variable fichier .inf a été créé par lepatriot
Bonjour,

Je cherche à récupérer des variables dans les fichiers inf. ClassGUID, DriverVer, Class, et la platform (x86 ou x64 si possible).

Y-a t'il une façon de les récupérer facilement en powershell ou il faut lire ligne par ligne?

Merci!

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 5 ans 6 mois #19299 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Variable fichier .inf
Salut,
il faut une fonction spécialisée qui analyse la structure.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 5 ans 5 mois #19301 par lepatriot
Réponse de lepatriot sur le sujet Re:Variable fichier .inf
Bon je suis capable de récupérer pas mal tout les informations que je veux.

Quelqu'un saurait comment on peut récupérer l'information pour savoir si le pilote est pour x86, x64 ou les 2? Du même genre que MDT.

J'ai cru lire sur Internet que nous pourrions le savoir en regardant dans Manufacturer, mais je ne sais pas comment récupérer cette information.

[Manufacturer]
%AMD%=AMD,NTx86.6.2,NTx86.6.0

Je sais que l'info est du x86 mais j'obtiens: System.Collections.DictionaryEntry

Je voudrais faire une match dans cette collection mais je ne comprend pas comment le faire.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 5 ans 5 mois #19302 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Variable fichier .inf
lepatriot écrit:

mais je ne comprend pas comment le faire.

Il nous faut le code et un exemple de fichier .ini que tu utilises.
Là, le lecteur est dans la même impasse :)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 5 ans 5 mois #19310 par lepatriot
Réponse de lepatriot sur le sujet Re:Variable fichier .inf
[code:1]
function Parse-IniFile
{
[CmdletBinding()]
Param
(
[Parameter(mandatory=$true,ValueFromPipeline=$true)]
[Alias(\"Fichier\"«»)]
[string]$fic
)

begin {}

Process
{
$ini = @{}
switch -regex -file $fic
{
\"^\[(.+)\]$\"
{
$section = $matches[1]
$ini[$section] = @{}
}
\"(.+)=(.+)\"
{
$name,$value = $matches[1..2]
$ini[$section][$name] = $value
}
}

return $ini
}

end {}
}


$file = \"c:\fichier.inf\"
$result = Parse-IniFile \"$file\"
$ClassINF = $result.version.class
$ClassGUID = $result.version.ClassGUID

$platform = $result.manufacturer
[/code:1]

Voici une parti du INF:

;
; Copyright (c) 2008-2012 AMD
;

[Version]
Signature=\"$Windows NT$\"
Provider=%AMD%
Class=HDC
ClassGUID={4d36e96a-e325-11ce-bfc1-08002be10318}
DriverVer=09/02/2012,1.3.001.0048
CatalogFile=amd_sata.cat

;- Files ---

[SourceDisksNames]
1 = %DiskId%,,,

[SourceDisksFiles]
amd_sata.sys = 1
amd_xata.sys = 1

[DestinationDirs]
DefaultDestDir = 12

;- PNP ---

[Manufacturer]
%AMD% = AMD,NTx86.6.2

[AMD.NTx86.6.2]
%AMDSATA.DeviceDesc% = amd_sata_inst, PCI\VEN_1002&DEV_4391&CC_0106
%AMDSATA.DeviceDesc% = amd_sata_inst, PCI\VEN_1002&DEV_4394&CC_0106
%AMDSATA.DeviceDesc% = amd_sata_inst, PCI\VEN_1022&DEV_7801&CC_0106
%AMDSATA.DeviceDesc% = amd_sata_inst, PCI\VEN_1022&DEV_7804&CC_0106


Je dois récupérer ce qu'il y à dans Version et dans Manufacturer. Version ça va mais Manufacturer je n'obtient que System.Collections.DictionaryEntry

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 5 ans 5 mois #19314 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Variable fichier .inf
Cette version supprime les espaces dans le noms d'une clé.

Ensuite $result.manufacturer renvoie une hashtable:
[code:1]
$Result.Manufacturer.'%AMD%'
#AMD,NTx86.6.2
[/code:1]
Pour extraire les informations il faut une regex qui suit les spécifications de INF Manufacturer Section .
A partir de ton exemple :

[Manufacturer]
%AMD% = AMD,NTx86.6.2

[AMD.NTx86.6.2]
%AMDSATA.DeviceDesc% = amd_sata_inst, PCIVEN_1002&DEV_4391&CC_0106

[code:1]
$regexINfArchitecture='^(?<ManufacturerName>.*?),nt(?<Architecture>.*?)\.(?<OSMajorVersion>.*?)\.(?<OSMinorVersion>.*?)((\.(?<ProductType>.*?))?(\.(?<SuiteMask>.*?))?)$'
$Manufacturer='AMD,NTx86.6.2'
$Manufacturer -match $regexINfArchitecture
$Matches
$Matches.Architecture
#x86

#Tests de la regex
# rv matches
# $Manufacturer='AMD,NTx86.6.2.5'
# $Manufacturer -match $regexINfArchitecture
# $Matches
#
# rv matches
# $Manufacturer='AMD,NTx86.6.2.5.9'
# $Manufacturer -match $regexINfArchitecture
# $Matches
#
#
# rv matches
# $Manufacturer='AMD,NTx86.6.2.0x0000001'
# $Manufacturer -match $regexINfArchitecture
# $Matches
#
# rv matches
# $Manufacturer='AMD,NTx86.6.2.0x0000001.0x00000002'
# $Manufacturer -match $regexINfArchitecture
# $Matches
[/code:1]

On peut aussi utiliser ceci pour créer un objet à partir de la string contenue dans $Result.Manufacturer.'%AMD%' :
[code:1]
$INfArchitecture=@{
TypeName='INF.Architecture'
Regex='^(?<ManufacturerName>.*?),nt(?<Architecture>.*?)\.(?<OSMajorVersion>.*?)\.(?<OSMinorVersion>.*?)((\.(?<ProductType>.*?))?(\.(?<SuiteMask>.*?))?)$'
Keys=0,1,2,3,4
}

$Manufacturer='AMD,NTx86.6.2'
$o=New-MatchesObject $Manufacturer @INfArchitecture
$o|gm
$O
# Architecture : x86
# ManufacturerName : AMD
# OSMajorVersion : 6
# OSMinorVersion : 2
[/code:1]
Avec une limite : les captures nommées optionnelles ?<ProductType> et ?<SuiteMask> si elles n'existent pas n'ont pas de correspondance dans l'objet généré.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.321 secondes
Propulsé par Kunena