2008-08-20 13 views
22

Hat jemand herausgefunden, wie PowerShell app.config Dateien zu verwenden? Ich habe ein paar .NET DLLs, die ich gerne in einem meiner Skripte verwenden würde, aber sie erwarten, dass ihre eigenen Konfigurationsabschnitte in app.config/web.config vorhanden sind.PowerShell App.Config

Antwort

32

Querverweise mit diesem Thread, der mich mit der gleichen Frage geholfen: Subsonic Access To App.Config Connection Strings From Referenced DLL in Powershell Script

Ich habe folgendes mein Skript, bevor die DLL aufrufen, die Konfigurationseinstellungen benötigt, wobei $ configpath die Lage der ist Datei, die ich laden möchte:

+3

Wow ... eine Antwort nach all den Jahren :). Danke, ich gebe das eine Chance. – Kev

+0

+1 Vielen Dank! Überall im Netz ist die einzige Lösung, die für dieses Problem erwähnt wird, "ConfigurationManager.OpenMappedExeConfiguration" und keine für ein Szenario, in dem wir keine Kontrolle über die referenzierte Assembly haben! Das funktioniert perfekt für meinen Fall. – fozylet

+2

Dieser Code hat nicht funktioniert, ich endete mit Robert Mooney's Lösung: http://StackOverflow.com/questions/16216736/loading-app-config-into-the-appdomain#answer-33290175 –

6

Ich vermute, dass die Einstellungen in Powershell.exe.config im Powershell-Verzeichnis sein müssten, aber das scheint ein schlechter Weg zu sein, Dinge zu tun.

Sie können ConfigurationManager.OpenMappedExeConfiguration verwenden, um eine Konfigurationsdatei basierend auf dem ausführenden DLL-Namen anstelle der Anwendungs-Exe zu öffnen. Dies würde jedoch offensichtlich Änderungen an den DLLs erfordern.

+0

Ich würde stark eine solche Lösung nicht verwenden. Wickeln Sie es in eine Konsolenanwendung ein, die Daten als JSON in STDOUT oder in die ASP.NET-WebAPI-App schreibt. Die Wahl zwischen Konsole und API hängt vom Hosting und der Sicherheit ab. – yzorg

+0

Ein weiterer Grund, dies NICHT zu verwenden: PowerShell wird mit dem Betriebssystem und powershell.exe aktualisiert.config ist eine geschützte OS-Datei, was bedeutet, dass sie nicht einfach mit Notepad bearbeitet werden kann. – yzorg

2

Versuch eine neue Antwort auf eine alte Frage.

Ich denke, die moderne Antwort wäre: Tu das nicht. PowerShell ist eine Shell. Die normale Art, Informationen zwischen Teilen der Shell weiterzuleiten, sind Shell-Variablen. Für Powershell das wäre wie folgt aussehen:

$global:MyComponent_MySetting = '12' 
# i.e. 
$PSDefaultParameterValues 
$ErrorActionPreference 

Wenn Einstellungen erwartet wird, über Prozesse Grenzen der Konvention Umgebungsvariablen vererbt werden verwenden. Ich erweitere dies auf Einstellungen, die die C#/PowerShell-Grenze überschreiten. Ein paar Beispiele:

$env:PATH 
$env:PSModulePath 

Wenn Sie denken, das ein Anti-Muster für .NET ist möchten Sie vielleicht zu überdenken. Dies ist die Norm für PAAS-gehostete Anwendungen und wird der neue Standard für ASP.NET sein, der auf der Server-optimierten CLR (ASP.NET v5) ausgeführt wird.

Siehe https://github.com/JabbR/JabbRv2/blob/dev/src/JabbR/Startup.cs#L21
Hinweis: zum Zeitpunkt des Schreibens ich die Verknüpfung zu .AddEnvironmentVariables()

habe ich diese Frage ein paar Mal neu aufgelegt, es selbst einschließlich fragen. Ich wollte einen Anteil am Boden setzen, um zu sagen, PowerShell-Zeug funktioniert nicht gut mit <appSettings>. IMO ist es viel besser, den Shell-Aspekt von PS über den .NET-Aspekt in dieser Hinsicht zu umfassen.

Wenn Sie komplexe Konfiguration benötigen, nehmen Sie eine JSON-Zeichenfolge. POSH v3 + hat ConvertFrom-JSON eingebaut. Wenn alles in Ihrem Prozess die gleiche komplexe Konfiguration verwendet, legen Sie es in eine .json-Datei und zeigen Sie auf diese Datei von einer Umgebungsvariablen.

Wenn eine einzelne Datei dort nicht ausreicht sind gut etablierte Lösungen wie das PATH Muster, .gitignore GIT Auflösung oder ASP.NET web.config Auflösung (die ich hier nicht wiederholen).

+1

"* tu das nicht. *" - sicher, und schätze die Zeit, die du in diese Antwort gesteckt hast. Aber Umgebungsvariablen usw. funktionieren nicht mit diesen Legacy-Assemblys. Sie erwarten, dass sie ihre Konfigurationen aus der 'AppSettings'-Sammlung lesen können. – Kev

+0

@Kev Dann sollten diese Assemblies wirklich nicht in einem PowerShell-Kontext verwendet werden. Möglicherweise müssen Sie PowerShell selbst hosten. Siehe "Einbetten von PowerShell", z. B. die "Package Manager Console" von Visual Studio. – yzorg