2017-03-06 4 views
1

Ich habe Powershell-Community-Erweiterungen installiert, weil ich Show-Tree für diesen Code verwenden möchte.Wie erhält man Powershell, um pscx-Module zu erkennen?

# Log project state 
# Assumes CWD is the project file 

$Tree = Show-Tree -ShowProperty -ShowLeaf | Where-Object {$_ -inotmatch '^.*Property.*' -or $_ -match '^.*LastWriteTime\s.*'} 

$i = 0 
$culture = [Globalization.CultureInfo]::InvariantCulture 

foreach($entry in $Tree){ 
    if($entry -notmatch '^.*Property.*'){ 
     $d = "{0:hh}:{0:mm}:{0:ss}" -f ([DateTime]::Parse($($Tree[$i+1] -replace '^.+=\s(.+)','$1'), $culture)) 
     $Tree[$i] = "$d`t$entry" 
    } 
    $i++ 
} 

$Tree = $Tree | Where-Object {$_ -inotmatch '^.*Property.*'} 

foreach($s in $Tree){Write-Output $s} 

Dies funktioniert in einer PS-Debug-Sitzung in VS-Code OK, aber wenn ich versuche, es in MSBuild zu verwenden oder mit der Powershell-Eingabeaufforderung, klagt er, dass es nicht das Erweiterungsmodul ...

findet
Show-Tree : The term 'Show-Tree' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At C:\Users\Admin\Documents\GitHub\powershell-scripts\ProjectSnapShot.ps1:6 char:9 
+ $Tree = Show-Tree -ShowProperty -ShowLeaf | Where-Object {$_ -inotmat ... 
+   ~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (Show-Tree:String) [], CommandNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

überprüfte ich die PSModulePath env Variable und es zeigt auf zwei gültige loctions, eine der Standardmodule und die anderen pscx Module ...

enter image description here

Laut the docs sollte dies bedeuten, dass das Modul automatisch geladen wird.

Im Allgemeinen können Sie bestimmen, wo Sie Ihre Modul, indem Sie einen der Pfade in der $ ENV gespeichert installieren sollten: PSModulePath Variable. Wenn Sie einen dieser Pfade verwenden, kann PowerShell das Modul automatisch finden und laden, wenn ein Benutzer in seinem Code anruft. Wenn Sie Ihr Modul an einem anderen Ort speichern, können Sie die PowerShell explizit an weiterleiten, indem Sie das Modul als Parameter übergeben, wenn Sie das Install-Module aufrufen.

Wie kann ich dies von der PS-Eingabeaufforderung zu arbeiten und wenn von MSBuild aufgerufen?

+0

Powershell ist eine sitzungsorientierte Sprache. Das heißt - es verhält sich manchmal anders, wenn es interaktiv und von der Kommandozeile aus ausgeführt wird. Es kann in verschiedenen Hosts anders ausgeführt werden. Einige Powershell-IDEs (leider nicht VS) erlauben das Zurücksetzen von Runspace, was zu vorhersagbaren Ergebnissen führt. In einigen Fällen - wie Typ-Alias-Caching - hilft nur der Neustart. –

Antwort

0

Unter der Annahme, dieses Problem bei Ihnen ist, wenn Sie den obigen Code als Skript ausgeführt wird, gibt es eine Reihe von Dingen, die Sie tun können, zum Beispiel:

Wenn Sie nur besorgt sind über das Skript auf Ihrem Computer ausgeführt wird , könnten Sie Import-Module den expliziten .psm1 Pfad der Moduldatei übergeben, die die Funktion Show-Tree enthält, bevor Sie die Variable $ Tree zuweisen.

Wenn Sie nach mehr Portabilität suchen, können Sie den Code, der die Funktion Show-Tree aus der Moduldatei .psm1 definiert, erneut in dieses Skript kopieren, bevor Sie die $ Tree-Variable zuweisen.

Wenn Sie mehr suchen um herauszufinden, warum dies, hier ist der Abschnitt über die Vererbung von der Powershell-Hilfedatei about_Scopes passiert:

Inheritance

Ein Kind Umfang erbt nicht die Variablen, Aliase und Funktionen aus dem übergeordneten Bereich. Wenn ein Element nicht privat ist, kann der untergeordnete Bereich die Elemente im übergeordneten Bereich anzeigen. Außerdem können die Elemente geändert werden, indem der übergeordnete Bereich explizit angegeben wird. Die Elemente sind jedoch nicht Teil des untergeordneten Bereichs.

Ein untergeordneter Bereich wird jedoch mit einer Gruppe von Elementen erstellt. In der Regel enthält es alle Aliasnamen, die die AllScope-Option aufweisen. Diese Option wird später in diesem Thema erläutert. Sie enthält alle Variablen mit der AllScope-Option sowie einige Variablen, mit denen der Bereich angepasst werden kann, z. B. MaximumFunctionCount.

+0

Aber warum läuft es in der VS-Code-Debug-Umgebung in Ordnung? Ich lese das seit (ich will sagen ver 3?) Die Module werden automatisch geladen. Es besteht also keine Notwendigkeit für eine 'Import-Modules'-Anweisung. Und die Modulpfade sind in der Variable env enthalten. Warum funktioniert es nicht? Der von Ihnen zitierte Abschnitt liest sich wie ein Monty-Python-Skript (eine halbe Biene, philosophisch, muss IPOs-facto zur Hälfte nicht sein ...). Und überhaupt gibt es keinen gemeinsamen Bereich zwischen meinem Code und der Bibliothek. Ich verstehe nicht, wie das relevant ist ... –

0

Dieses Problem wurde nach dem Neustart meines Computers behoben. Es gab einige andere seltsame Instabilitäten (neue Fehler wurden geworfen, obwohl sich nichts geändert hatte), die auch nach dem Neustart verschwanden.

0

Ich beobachtete ähnliches Verhalten auch. Auch wenn die GUI anzeigt, dass PSMODULEPATH in Ordnung ist, werden laufende Änderungen (wie explorer.exe) nicht automatisch an die Umgebung angepasst. Normalerweise hilft Log-Off/-On oder ein Neustart.

Hintergrund: Wenn ein Prozess gestartet wird, wird die aktuelle Umgebung in den Prozess "kopiert". Wenn ein Prozess einen anderen Prozess startet, z. B. wenn Sie ein Programm mit Windows Explorer starten, erhält der neue untergeordnete Prozess eine Kopie der übergeordneten Prozessumgebung. Änderungen an den Benutzer- oder Systemumgebungsvariablen werden daher nicht von laufenden Prozessen übernommen, es sei denn, der Prozess überwacht explizit die WM_SETTINGSCHANGED-Fenstermeldung und reagiert entsprechend. Aus meiner Erfahrung tun nicht viele Prozesse das richtig.

+0

VS Code muss einen neuen Prozess für jeden Debug-Lauf starten und meine Powershell-Sitzung wurde zwischen Läufen nicht geschlossen, so dass das erklären würde. Das einzige, was ich immer noch nicht verstehe, ist, warum MSBulid sie geworfen hat. Ich rufe es von einem Ziel, das in meine 'csproj'-Datei importiert wird. Ich denke, es muss eine Instanz von ps für die ganze Sitzung zwischengespeichert werden. –

Verwandte Themen