Question
win32_keyboard \"layout\"
- Olivier
- Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 182
- Remerciements reçus 0
il y a 17 ans 1 mois #4014
par Olivier
win32_keyboard \"layout\" a été créé par Olivier
Bonjour !
J'ai un problème avec la commande suivante :
[code:1](get-wmiobject win32_keyboard).layout[/code:1]
Pourquoi cette commande me retourne pas le code \"layout\" ? qui devrait correspondre dans mon cas à \"0000100C\" ou plutôt à \"0000040C\" pour ceux de l'exagone
Merci d'avance pour vos lumières
Olivier
J'ai un problème avec la commande suivante :
[code:1](get-wmiobject win32_keyboard).layout[/code:1]
Pourquoi cette commande me retourne pas le code \"layout\" ? qui devrait correspondre dans mon cas à \"0000100C\" ou plutôt à \"0000040C\" pour ceux de l'exagone
Merci d'avance pour vos lumières
Olivier
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 17 ans 1 mois #4017
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:win32_keyboard "layout"
Ah! Erreur commune, qui illustre pile poil mon propos de l'autre jour sur la difficulté de savoir à l'avance si une commande retourne une valeur scalaire ou une énumération.
Ici, tu essaies d'accéder directement à la propriété layout de l'objet retourné par la commande \"gwmi win32_keyboard\". Ca ne marchera que si cette commande retourne un objet qui a une telle propriété... Jusque là on est d'accord.
En fait, les instances de win32_keyboard ont bien une propriété layout. Alors que se passe-t-il? Hé bien, de toute évidence la requête retourne plusieurs instances de win32_keyboard. Donc, l'objet retourné est une énumération, et cette énumération en tant que telle n'a aucune propriété répondant au doux nom de \"layout\".
Si tu regardes dans ton gestionnaire de matériel tu devrais en effet voir plusieurs claviers enregistrés - ça parait bizarre, mais ça marche comme ça.
Pour le vérifier dans PowerShell, si tu tapes simplement la commande suivante, tu verras que tu as bien au moins deux instances de win32_keyboard :
[code:1]
gwmi win32_keyboard | ft description, layout
[/code:1]
A priori, les différentes configurations devraient toutes avoir le même layout. Pour récupérer cette valeur tu pourras donc simplement faire ceci :
[code:1]
# récupérer le \"layout\" de la 1ere instance de win32_keyboard :
(gwmi win32_keyboard)[0].layout
[/code:1]
Mais en fait, le code clavier récupéré est un réglage propre à l'utilisateur en cours. Une technique possible consisterait à interroger la base de registre, et plus particulièrment la ruche HKCU (HKEY_CURRENT_USER) :
[code:1]
(get-itemproperty \"hkcu:\Keyboard layout\preload\"«»).\"1\"
[/code:1]
Janel<br><br>Message édité par: janel, à: 11/02/09 08:43
Ici, tu essaies d'accéder directement à la propriété layout de l'objet retourné par la commande \"gwmi win32_keyboard\". Ca ne marchera que si cette commande retourne un objet qui a une telle propriété... Jusque là on est d'accord.
En fait, les instances de win32_keyboard ont bien une propriété layout. Alors que se passe-t-il? Hé bien, de toute évidence la requête retourne plusieurs instances de win32_keyboard. Donc, l'objet retourné est une énumération, et cette énumération en tant que telle n'a aucune propriété répondant au doux nom de \"layout\".
Si tu regardes dans ton gestionnaire de matériel tu devrais en effet voir plusieurs claviers enregistrés - ça parait bizarre, mais ça marche comme ça.
Pour le vérifier dans PowerShell, si tu tapes simplement la commande suivante, tu verras que tu as bien au moins deux instances de win32_keyboard :
[code:1]
gwmi win32_keyboard | ft description, layout
[/code:1]
A priori, les différentes configurations devraient toutes avoir le même layout. Pour récupérer cette valeur tu pourras donc simplement faire ceci :
[code:1]
# récupérer le \"layout\" de la 1ere instance de win32_keyboard :
(gwmi win32_keyboard)[0].layout
[/code:1]
Mais en fait, le code clavier récupéré est un réglage propre à l'utilisateur en cours. Une technique possible consisterait à interroger la base de registre, et plus particulièrment la ruche HKCU (HKEY_CURRENT_USER) :
[code:1]
(get-itemproperty \"hkcu:\Keyboard layout\preload\"«»).\"1\"
[/code:1]
Janel<br><br>Message édité par: janel, à: 11/02/09 08:43
Connexion ou Créer un compte pour participer à la conversation.
- Olivier
- Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 182
- Remerciements reçus 0
il y a 17 ans 1 mois #4022
par Olivier
Réponse de Olivier sur le sujet Re:win32_keyboard "layout"
Bonjour à tous !
J'ai bien intégré les conseils de Mr. Janel dans mon script et en local, tout va bien ! (ou presque
) quand j'utilise la commande suivante :
[code:1][Convert]::ToInt32((Get-WmiObject win32_keyboard)[0].layout,16)[/code:1]
Sur mon Vista en local ça fonctionne mais si j'exécute cette commande sur un XP SP2 ou 3 ou un serveur 2008, j'ai l'erreur suivante :
Est-ce que vous auriez une piste ?
En fait, la commande suivante ne passe même pas : (Sauf sur mon Vista)
[code:1](Get-WmiObject win32_keyboard)[0].layout[/code:1]
Elle me génère la même erreur sur mes autres postes ... Sur mon Vista, elle me retourne bien \"0000100C\"
Merci d'avance pour les lumières apportées à mon \"bug\"
et pour tous les conseils et solutions déjà apportées ! www.powershell-scripting.com c'est du béton :) !!
Olivier
PS :
La commande [code:1](get-itemproperty \"hkcu:\Keyboard layout\preload\"«»).\"1\"[/code:1]
fonctionne mais n'est-il pas préférable de soutirer les infos par les composants WMI ?<br><br>Message édité par: Olivier, à: 12/02/09 00:43
J'ai bien intégré les conseils de Mr. Janel dans mon script et en local, tout va bien ! (ou presque
[code:1][Convert]::ToInt32((Get-WmiObject win32_keyboard)[0].layout,16)[/code:1]
Sur mon Vista en local ça fonctionne mais si j'exécute cette commande sur un XP SP2 ou 3 ou un serveur 2008, j'ai l'erreur suivante :
Unable to index into an object of type System.Management.ManagementObject.
At line:1 char:51
+ [Convert]::ToInt32((Get-WmiObject win32_keyboard)[ <<<< 0].layout,16)
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
Est-ce que vous auriez une piste ?
En fait, la commande suivante ne passe même pas : (Sauf sur mon Vista)
[code:1](Get-WmiObject win32_keyboard)[0].layout[/code:1]
Elle me génère la même erreur sur mes autres postes ... Sur mon Vista, elle me retourne bien \"0000100C\"
Merci d'avance pour les lumières apportées à mon \"bug\"
Olivier
PS :
La commande [code:1](get-itemproperty \"hkcu:\Keyboard layout\preload\"«»).\"1\"[/code:1]
fonctionne mais n'est-il pas préférable de soutirer les infos par les composants WMI ?<br><br>Message édité par: Olivier, à: 12/02/09 00:43
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 1 mois #4023
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:win32_keyboard
Salut,
vérifie que tu reçois bien + éléments
[code:1]
$Tab=Get-WmiObject win32_keyboard
if ($Tab -is [array])
{[Convert]::ToInt32($Tab[0].layout,16) }[/code:1]
On ne peut indexer que dans un tableau et pas un scalaire. Sur mon poste cet appel me renvoi une seule valeur
vérifie que tu reçois bien + éléments
[code:1]
$Tab=Get-WmiObject win32_keyboard
if ($Tab -is [array])
{[Convert]::ToInt32($Tab[0].layout,16) }[/code:1]
On ne peut indexer que dans un tableau et pas un scalaire. Sur mon poste cet appel me renvoi une seule valeur
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Olivier
- Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 182
- Remerciements reçus 0
il y a 17 ans 1 mois #4025
par Olivier
Réponse de Olivier sur le sujet Re:win32_keyboard
Bonjour Laurent !
Ben sur mon Vista, ça me renvoie bien la valeur \"4108\"
Vista:
[code:1]PS C:\Users\Olivier Demont> $Tab=Get-WmiObject win32_keyboard
if ($Tab -is [array])
{[Convert]::ToInt32($Tab[0].layout,16) }
4108[/code:1]
Mais sur XP SP3, ça renvoie rien ...
XP SP3:
[code:1]PS C:\Users\Olivier Demont> $Tab=Get-WmiObject win32_keyboard
if ($Tab -is [array])
{[Convert]::ToInt32($Tab[0].layout,16) }[/code:1]
Comment se fait-ce ?
Pour contourner le problème, j'ai mis le code suivant dans mon script :
[code:1]$ObjKeyboards = [Convert]::ToInt32((get-itemproperty \"hkcu:\Keyboard layout\preload\"«»).\"1\",16)
$OSLanguage = (Get-WmiObject win32_operatingsystem).OSlanguage
$map = @{
\"1\"=\"Arabic\"
\"4\"=\"Chinese (Simplified)– China\"
\"9\"=\"English\"
\"1025\"=\"Arabic – Saudi Arabia\"
\"1026\"=\"Bulgarian\"
\"1027\"=\"Catalan\"
\"1028\"=\"Chinese (Traditional) – Taiwan\"
\"1029\"=\"Czech\"
\"1030\"=\"Danish\"
\"1031\"=\"German – Germany\"
\"1032\"=\"Greek\"
\"1033\"=\"English – United States\"
\"1034\"=\"Spanish – Traditional Sort\"
\"1035\"=\"Finnish\"
\"1036\"=\"French – France\"
\"1037\"=\"Hebrew\"
\"1038\"=\"Hungarian\"
\"1039\"=\"Icelandic\"
\"1040\"=\"Italian – Italy\"
\"1041\"=\"Japanese\"
\"1042\"=\"Korean\"
\"1043\"=\"Dutch – Netherlands\"
\"1044\"=\"Norwegian – Bokmal\"
\"1045\"=\"Polish\"
\"1046\"=\"Portuguese – Brazil\"
\"1047\"=\"Rhaeto-Romanic\"
\"1048\"=\"Romanian\"
\"1049\"=\"Russian\"
\"1050\"=\"Croatian\"
\"1051\"=\"Slovak\"
\"1052\"=\"Albanian\"
\"1053\"=\"Swedish\"
\"1054\"=\"Thai\"
\"1055\"=\"Turkish\"
\"1056\"=\"Urdu\"
\"1057\"=\"Indonesian\"
\"1058\"=\"Ukrainian\"
\"1059\"=\"Belarusian\"
\"1060\"=\"Slovenian\"
\"1061\"=\"Estonian\"
\"1062\"=\"Latvian\"
\"1063\"=\"Lithuanian\"
\"1065\"=\"Persian\"
\"1066\"=\"Vietnamese\"
\"1069\"=\"Basque\"
\"1070\"=\"Serbian\"
\"1071\"=\"Macedonian (F.Y.R.O. Macedonia)\"
\"1072\"=\"Sutu\"
\"1073\"=\"Tsonga\"
\"1074\"=\"Tswana\"
\"1076\"=\"Xhosa\"
\"1077\"=\"Zulu\"
\"1078\"=\"Afrikaans\"
\"1080\"=\"Faeroese\"
\"1081\"=\"Hindi\"
\"1082\"=\"Maltese\"
\"1084\"=\"Gaelic\"
\"1085\"=\"Yiddish\"
\"1086\"=\"Malay – Malaysia\"
\"2049\"=\"Arabic – Iraq\"
\"2052\"=\"Chinese (Simplified) – PRC\"
\"2055\"=\"German – Switzerland\"
\"2057\"=\"English – United Kingdom\"
\"2058\"=\"Spanish – Mexico\"
\"2060\"=\"French – Belgium\"
\"2064\"=\"Italian – Switzerland\"
\"2067\"=\"Dutch – Belgium\"
\"2068\"=\"Norwegian – Nynorsk\"
\"2070\"=\"Portuguese – Portugal\"
\"2072\"=\"Romanian – Moldova\"
\"2073\"=\"Russian – Moldova\"
\"2074\"=\"Serbian – Latin\"
\"2077\"=\"Swedish – Finland\"
\"3073\"=\"Arabic – Egypt\"
\"3076\"=\"Chinese (Traditional) – Hong Kong SAR\"
\"3079\"=\"German – Austria\"
\"3081\"=\"English – Australia\"
\"3082\"=\"Spanish – International Sort\"
\"3084\"=\"French – Canada\"
\"3098\"=\"Serbian – Cyrillic\"
\"4097\"=\"Arabic – Libya\"
\"4100\"=\"Chinese (Simplified) – Singapore\"
\"4103\"=\"German – Luxembourg\"
\"4105\"=\"English – Canada\"
\"4106\"=\"Spanish – Guatemala\"
\"4108\"=\"French – Switzerland\"
\"5121\"=\"Arabic – Algeria\"
\"5127\"=\"German – Liechtenstein\"
\"5129\"=\"English – New Zealand\"
\"5130\"=\"Spanish – Costa Rica\"
\"5132\"=\"French – Luxembourg\"
\"6145\"=\"Arabic – Morocco\"
\"6153\"=\"English – Ireland\"
\"6154\"=\"Spanish – Panama\"
\"7169\"=\"Arabic – Tunisia\"
\"7177\"=\"English – South Africa\"
\"7178\"=\"Spanish – Dominican Republic\"
\"8193\"=\"Arabic – Oman\"
\"8201\"=\"English – Jamaica\"
\"8202\"=\"Spanish – Venezuela\"
\"9217\"=\"Arabic – Yemen\"
\"9226\"=\"Spanish – Colombia\"
\"10241\"=\"Arabic – Syria\"
\"10249\"=\"English – Belize\"
\"10250\"=\"Spanish – Peru\"
\"11265\"=\"Arabic – Jordan\"
\"11273\"=\"English – Trinidad\"
\"11274\"=\"Spanish – Argentina\"
\"12289\"=\"Arabic – Lebanon\"
\"12298\"=\"Spanish – Ecuador\"
\"13313\"=\"Arabic – Kuwait\"
\"13322\"=\"Spanish – Chile\"
\"14337\"=\"Arabic – U.A.E.\"
\"14346\"=\"Spanish – Uruguay\"
\"15361\"=\"Arabic – Bahrain\"
\"15370\"=\"Spanish – Paraguay\"
\"16385\"=\"Arabic – Qatar\"
\"16394\"=\"Spanish – Bolivia\"
\"17418\"=\"Spanish – El Salvador\"
\"18442\"=\"Spanish – Honduras\"
\"19466\"=\"Spanish – Nicaragua\"
\"20490\"=\"Spanish – Puerto Rico\"
}
$keyb = $map.$(\"$ObjKeyboards\"«»)
if (!$keyb)
{ $keyb = \"Unknown\"
}
$OSLang = $map.$(\"$OSLanguage\"«»)
if (!$OSLang)
{ $OSLang = \"Unknown\"
}
cls
\"Configuration du clavier = $keyb\"
\"Langue du système d'exploitation = $OSLang\"[/code:1]
Dans ce cas, la Hashtable est similaire pour les config clavier et pour les code de Pays et autres ... (enfin pas vérifier mais pour l'instant il me retourne bien de bonne valeurs ...)
Les sources de correspondance des codes viennent de MSDN : Win32_OperatingSystem Class
Ben sur mon Vista, ça me renvoie bien la valeur \"4108\"
Vista:
[code:1]PS C:\Users\Olivier Demont> $Tab=Get-WmiObject win32_keyboard
if ($Tab -is [array])
{[Convert]::ToInt32($Tab[0].layout,16) }
4108[/code:1]
Mais sur XP SP3, ça renvoie rien ...
XP SP3:
[code:1]PS C:\Users\Olivier Demont> $Tab=Get-WmiObject win32_keyboard
if ($Tab -is [array])
{[Convert]::ToInt32($Tab[0].layout,16) }[/code:1]
Comment se fait-ce ?
Pour contourner le problème, j'ai mis le code suivant dans mon script :
[code:1]$ObjKeyboards = [Convert]::ToInt32((get-itemproperty \"hkcu:\Keyboard layout\preload\"«»).\"1\",16)
$OSLanguage = (Get-WmiObject win32_operatingsystem).OSlanguage
$map = @{
\"1\"=\"Arabic\"
\"4\"=\"Chinese (Simplified)– China\"
\"9\"=\"English\"
\"1025\"=\"Arabic – Saudi Arabia\"
\"1026\"=\"Bulgarian\"
\"1027\"=\"Catalan\"
\"1028\"=\"Chinese (Traditional) – Taiwan\"
\"1029\"=\"Czech\"
\"1030\"=\"Danish\"
\"1031\"=\"German – Germany\"
\"1032\"=\"Greek\"
\"1033\"=\"English – United States\"
\"1034\"=\"Spanish – Traditional Sort\"
\"1035\"=\"Finnish\"
\"1036\"=\"French – France\"
\"1037\"=\"Hebrew\"
\"1038\"=\"Hungarian\"
\"1039\"=\"Icelandic\"
\"1040\"=\"Italian – Italy\"
\"1041\"=\"Japanese\"
\"1042\"=\"Korean\"
\"1043\"=\"Dutch – Netherlands\"
\"1044\"=\"Norwegian – Bokmal\"
\"1045\"=\"Polish\"
\"1046\"=\"Portuguese – Brazil\"
\"1047\"=\"Rhaeto-Romanic\"
\"1048\"=\"Romanian\"
\"1049\"=\"Russian\"
\"1050\"=\"Croatian\"
\"1051\"=\"Slovak\"
\"1052\"=\"Albanian\"
\"1053\"=\"Swedish\"
\"1054\"=\"Thai\"
\"1055\"=\"Turkish\"
\"1056\"=\"Urdu\"
\"1057\"=\"Indonesian\"
\"1058\"=\"Ukrainian\"
\"1059\"=\"Belarusian\"
\"1060\"=\"Slovenian\"
\"1061\"=\"Estonian\"
\"1062\"=\"Latvian\"
\"1063\"=\"Lithuanian\"
\"1065\"=\"Persian\"
\"1066\"=\"Vietnamese\"
\"1069\"=\"Basque\"
\"1070\"=\"Serbian\"
\"1071\"=\"Macedonian (F.Y.R.O. Macedonia)\"
\"1072\"=\"Sutu\"
\"1073\"=\"Tsonga\"
\"1074\"=\"Tswana\"
\"1076\"=\"Xhosa\"
\"1077\"=\"Zulu\"
\"1078\"=\"Afrikaans\"
\"1080\"=\"Faeroese\"
\"1081\"=\"Hindi\"
\"1082\"=\"Maltese\"
\"1084\"=\"Gaelic\"
\"1085\"=\"Yiddish\"
\"1086\"=\"Malay – Malaysia\"
\"2049\"=\"Arabic – Iraq\"
\"2052\"=\"Chinese (Simplified) – PRC\"
\"2055\"=\"German – Switzerland\"
\"2057\"=\"English – United Kingdom\"
\"2058\"=\"Spanish – Mexico\"
\"2060\"=\"French – Belgium\"
\"2064\"=\"Italian – Switzerland\"
\"2067\"=\"Dutch – Belgium\"
\"2068\"=\"Norwegian – Nynorsk\"
\"2070\"=\"Portuguese – Portugal\"
\"2072\"=\"Romanian – Moldova\"
\"2073\"=\"Russian – Moldova\"
\"2074\"=\"Serbian – Latin\"
\"2077\"=\"Swedish – Finland\"
\"3073\"=\"Arabic – Egypt\"
\"3076\"=\"Chinese (Traditional) – Hong Kong SAR\"
\"3079\"=\"German – Austria\"
\"3081\"=\"English – Australia\"
\"3082\"=\"Spanish – International Sort\"
\"3084\"=\"French – Canada\"
\"3098\"=\"Serbian – Cyrillic\"
\"4097\"=\"Arabic – Libya\"
\"4100\"=\"Chinese (Simplified) – Singapore\"
\"4103\"=\"German – Luxembourg\"
\"4105\"=\"English – Canada\"
\"4106\"=\"Spanish – Guatemala\"
\"4108\"=\"French – Switzerland\"
\"5121\"=\"Arabic – Algeria\"
\"5127\"=\"German – Liechtenstein\"
\"5129\"=\"English – New Zealand\"
\"5130\"=\"Spanish – Costa Rica\"
\"5132\"=\"French – Luxembourg\"
\"6145\"=\"Arabic – Morocco\"
\"6153\"=\"English – Ireland\"
\"6154\"=\"Spanish – Panama\"
\"7169\"=\"Arabic – Tunisia\"
\"7177\"=\"English – South Africa\"
\"7178\"=\"Spanish – Dominican Republic\"
\"8193\"=\"Arabic – Oman\"
\"8201\"=\"English – Jamaica\"
\"8202\"=\"Spanish – Venezuela\"
\"9217\"=\"Arabic – Yemen\"
\"9226\"=\"Spanish – Colombia\"
\"10241\"=\"Arabic – Syria\"
\"10249\"=\"English – Belize\"
\"10250\"=\"Spanish – Peru\"
\"11265\"=\"Arabic – Jordan\"
\"11273\"=\"English – Trinidad\"
\"11274\"=\"Spanish – Argentina\"
\"12289\"=\"Arabic – Lebanon\"
\"12298\"=\"Spanish – Ecuador\"
\"13313\"=\"Arabic – Kuwait\"
\"13322\"=\"Spanish – Chile\"
\"14337\"=\"Arabic – U.A.E.\"
\"14346\"=\"Spanish – Uruguay\"
\"15361\"=\"Arabic – Bahrain\"
\"15370\"=\"Spanish – Paraguay\"
\"16385\"=\"Arabic – Qatar\"
\"16394\"=\"Spanish – Bolivia\"
\"17418\"=\"Spanish – El Salvador\"
\"18442\"=\"Spanish – Honduras\"
\"19466\"=\"Spanish – Nicaragua\"
\"20490\"=\"Spanish – Puerto Rico\"
}
$keyb = $map.$(\"$ObjKeyboards\"«»)
if (!$keyb)
{ $keyb = \"Unknown\"
}
$OSLang = $map.$(\"$OSLanguage\"«»)
if (!$OSLang)
{ $OSLang = \"Unknown\"
}
cls
\"Configuration du clavier = $keyb\"
\"Langue du système d'exploitation = $OSLang\"[/code:1]
Dans ce cas, la Hashtable est similaire pour les config clavier et pour les code de Pays et autres ... (enfin pas vérifier mais pour l'instant il me retourne bien de bonne valeurs ...)
Les sources de correspondance des codes viennent de MSDN : Win32_OperatingSystem Class
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 1 mois #4029
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:win32_keyboard
Olivier écrit:
Le \"else\" du test est implicite, c'est à dire si ce n'est pas un tableau c'est un scalaire, CQFD.
Le code associé au test ou à l'appel WMI ?Mais sur XP SP3, ça renvoie rien ...
Le \"else\" du test est implicite, c'est à dire si ce n'est pas un tableau c'est un scalaire, CQFD.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.108 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- win32_keyboard "layout"