J'y ai réfléchi en répondant à cette question .
Comment pouvez-vous éviter d'avoir à qualifier entièrement chaque type dans un espace de noms?
C'est vraiment, vraiment fastidieux d'écrire System.Security.Cryptography.X509Certificates.X509Store
au lieu de X509Store
, ou [System.Security.Cryptography.X509Certificates.StoreName]::My
au lieu de [StoreName]::My
.
En C #, vous avez des using
directives ... et Powershell?
EDIT 1 - Cela fonctionne pour les types:
$ns = "System.Security.Cryptography.X509Certificates"
$store = New-Object "$ns.X509Store"(StoreName,StoreLocation)
New-Object prend un littéral de chaîne comme définition de type, il peut donc être construit par programme.
EDIT 2 - Cela fonctionne pour les membres d'énumération utilisés comme paramètres:
$store = New-Object "$ns.X509Store"("My","LocalMachine")
Où "My" est [System.Security.Cryptography.X509Certificates.StoreName]::My
et "LocalMachine" [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine
.
Les noms littéraux sont automatiquement convertis en membres d'énumération, s'ils sont placés là où un membre d'énumération est attendu.
la source
Réponses:
Je sais, c'est un peu tard, mais PowerShell v5 ajoute des tonnes de trucs de langage sympas. L'un d'eux est «l'utilisation de l'espace de noms».
la source
Pour les énumérations, vous n'avez pas besoin de spécifier le nom complet du type. Par exemple:
Tu peux le faire:
ou la version beaucoup plus simple:
Vous pouvez utiliser des chaînes pour identifier les énumérations que vous souhaitez utiliser sans avoir à utiliser le nom entièrement décoré. PowerShell gère le transtypage pour que vous convertissiez les chaînes en valeurs d'énumération. En utilisant l'exemple spécifique que vous avez montré ci-dessus, cela signifie que vous pouvez le faire:
Et Powershell le convertira correctement (donc passer 'ReadWrite' à un paramètre qui prend une valeur d'énumération OpenFlags fonctionnera très bien). Si vous voulez passer plusieurs valeurs, vous pouvez le faire comme ceci:
Notez que je préfixe ces commandes avec le nom du type, mais si vous les passiez à un paramètre tapé, vous laisseriez simplement cela de côté.
Cela devrait vous rapprocher de la possibilité d'écrire des scripts qui fonctionnent avec un espace de noms spécifique sans avoir à décorer tous les noms.
la source
Le droit chemin?
Et cela semble fonctionner:
Mais c'est moche quand tu fais ça:
la source