2010-11-19 10 views
0

Je l'extrait de code de script suivante PowerShell dans mon profil:Qu'est-ce que PowerShell snippet moyenne (parsing syntaxe aide!)

. (join-path (split-path (& { $myInvocation.ScriptName })) "export-errors.ps1") 

Maintenant, je comprends que cela provoque le script export-errors.ps1 qui existe dans le même répertoire comme mon script de profil à exécuter. Ma question est, pourquoi?

Je ne comprends pas pourquoi la construction & { xxx } est différente que xxx dans ce cas. J'ai essayé d'utiliser cette construction similaire:

$lame = join-path (split-path $myinvocation.mycommand.definition) "_lame\lame.exe" 

Cela ne fonctionne pas, cependant. J'ai des erreurs sur les fournisseurs qui n'existent pas, et je ne comprends pas vraiment pourquoi.

Pourquoi la première construction fonctionne-t-elle, et pas la seconde?

MISE À JOUR

Il est devenu clair pour moi que je courais le mauvais bug. En effet, les deux constructions fonctionnent, sous certaines conditions. La condition sous laquelle j'exécutais la deuxième construction, cependant, est celle dans laquelle NEITHER fonctionne. Je vais poser une question distincte à ce sujet. Keith a presque certainement raison quand il dit que la première construction est une tentative de contourner certaines bizarreries. C'était une chose de copier-coller d'il y a longtemps.

+0

La commande 'lame' fonctionne pour moi. '$ lame' est une chaîne de résultats comme' C: \ TEMP \ _101119_163554 \ _lame \ lame.exe'. Pour l'exécuter en tant qu'utilisation de commande. ou & opérateur: '. $ lame'. –

+0

BTW, ce code devrait être invoqué dans un script sinon il ne fonctionne pas comme "prévu". –

Répondre

2

Cette syntaxe est probablement au-dessus de la top pour l'approvisionnement en points dans votre profil. Ce qui suit devrait être suffisant dans le contexte de votre script profile.ps1:

. (join-path (split-path $MyInvocation.MyCommand.Path) export-errors.ps1) 

Bien sûr, si vous êtes sourçage dot plus d'un fichier que vous pouvez aller dans cette voie:

$ScriptPath = $MyInvocation.MyCommand.Path 
$ScriptDir = Split-Path $ScriptPath -Parent 
. $ScriptDir\lib.ps1 

I Je crois que votre approche originale tente de contourner un problème que je décris au this blog post.