2010-05-05 2 views
7

Cela peut être une question stupide, mais sont les alias par défaut (par exemple cd) codés en dur dans PowerShell ou définis dans un script de «profil» caché quelque part?Où sont les alias par défaut définis dans PowerShell?

Je n'ai pas de profils définis (par utilisateur ou par système) donc je me demande d'où viennent les paramètres par défaut.

Répondre

10

Ils sont "intégrés" mais pas immuables. Note:

 
PS > (Get-Alias dir).Options 
AllScope 
PS > (Get-Alias gci).Options 
ReadOnly, AllScope

PS > Get-Alias | group Options

Count Name Group ----- ---- ----- 91 ReadOnly, AllScope {%, ?, ac, asnp...} 46 AllScope {cat, cd, chdir, clear...}

Comme vous pouvez le voir, il y a un certain cloisonnement des alias par l'option ReadOnly. Les ReadOnly sont idiomatiques dans PowerShell, tandis que les mutables sont pour les personnes familières avec d'autres coques. J'ai vu des gens modifier dir pour ajouter plus de fonctionnalités, tout en gardant gci comme un alias droit à Get-ChildItem.

Pour une compatibilité étendue, j'utilise uniquement les alias ReadOnly dans mes scripts.

Aussi, parce que dir dans le CMD, ls sous UNIX et gci dans PowerShell chaque œuvre à leur manière, je me former à utiliser la commande native, et non un alias. dir a tendance à travailler partout, mais pas dir -Recurse!

Comme un exercice de formation, et de tester mes scripts pour la compatibilité, je supprimer parfois les ReadOnly non alias:

Get-Alias | ? { ! ($_.Options -match "ReadOnly") } | % { Remove-Item alias:$_ } 

Il y a une approche plus douce où vous remplacez chaque alias avec une nouvelle commande qui vous avertit que vous utilisez l'un des alias de compatibilité, mais vous permet de continuer à fonctionner.

En outre, vous pouvez modifier les ReadOnly alias si vous voulez vraiment, mais pour les raisons ci-dessus je recommande contre:

 
PS > Set-Alias -Name sl -Value Get-ChildItem -Force -Option AllScope  # BAD! 
PS > sl

Directory: C:\Users\Jay

Mode LastWriteTime Length Name ---- ------------- ------ ----

+1

Merci (et d'autres aussi) pour une excellente explication! – Xerion

+1

En fait, la partie que vous étiez étiqueté comme «# BAD!» Est exactement ce que je cognais ma tête contre le mur en essayant de comprendre comment faire - remplacer un alias ReadOnly. J'avais essayé ** - Force ** et ** - Option AllScope ** séparément, et bien sûr aucun d'entre eux n'a fonctionné. Pour une raison ou une autre, il ne m'est pas venu à l'esprit que chacun aborde un obstacle différent, les deux s'appliquant aux alias ReadOnly, ils doivent donc être utilisés ensemble ... duh! –

+0

Si vous devez savoir, je voulais alias ** sl ** à ** Push-Location ** afin que je puisse changer le comportement sans changer mes habitudes. Il peut également être utile d'avoir un alias intégré référençant une commande proxy de la commande à laquelle il fait normalement référence. Encore une fois, changer le comportement de la commande sans changer vos habitudes. Alors ... ce n'est pas forcément toujours "# BAD!".;) –

1

Bien que je ne connaisse pas les détails techniques, je dirais qu'ils sont codés en dur et qu'ils ne sont pas configurables. Ils peuvent être redéfinis ou supprimés mais l'ensemble initial n'est pas sous notre contrôle.

+0

Ce qui est une bonne chose, à mon humble avis. – Joey

0

Ils sont hardcoded.

6

Hardcoded, mais récupérables (comme la plupart des choses "cachées" dans PowerShell)

PS> [Management.Automation.Runspaces.InitialSessionState].getproperty(
     "BuiltInAliases", [reflection.bindingflags]"NonPublic,Static").getvalue(
      $null, @()) | format-table -auto 

Definition   Description   Options CommandType Visibility Name PSSnapIn Module 
----------   -----------   ------- ----------- ---------- ---- -------- ------ 
Add-Content      ReadOnly, AllScope  Alias  Public ac 
Add-PSSnapIn      ReadOnly, AllScope  Alias  Public asnp 
Clear-Content     ReadOnly, AllScope  Alias  Public clc 
Clear-Item      ReadOnly, AllScope  Alias  Public cli 
Clear-ItemProperty    ReadOnly, AllScope  Alias  Public clp 
Clear-Variable     ReadOnly, AllScope  Alias  Public clv 
... 

;-)

+2

get-alias fonctionne bien sûr, mais le code ci-dessus est définitif indépendamment des autres modules/snapins ajoutant leur propre au mélange. – x0n

Questions connexes