PowerShell App.Config
-
09-06-2019 - |
Pergunta
Alguém descobriu como fazer o PowerShell usar app.config
arquivos?Eu tenho algumas DLLs .NET que gostaria de usar em um de meus scripts, mas eles esperam que suas próprias seções de configuração estejam presentes em app.config
/web.config
.
Solução
Referência cruzada com este tópico, que me ajudou com a mesma pergunta:Acesso subsônico a strings de conexão App.Config de DLL referenciada no script Powershell
Adicionei o seguinte ao meu script, antes de invocar a DLL que precisa de configurações, onde $configpath é o local do arquivo que desejo carregar:
[appdomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $configpath)
Add-Type -AssemblyName System.Configuration
Ver esse post para garantir que o arquivo de configuração especificado seja aplicado ao contexto em execução.
Outras dicas
Suponho que as configurações teriam que estar em powershell.exe.config no diretório powershell, mas essa parece ser uma maneira ruim de fazer as coisas.
Você pode usar ConfigurationManager.OpenMappedExeConfiguration para abrir um arquivo de configuração com base no nome da DLL em execução, em vez do exe do aplicativo, mas isso obviamente exigiria alterações nas DLLs.
Tentando uma nova resposta para uma pergunta antiga.
Acho que a resposta moderna seria:não faça isso.PowerShell é um shell.A maneira normal de passar informações entre partes do shell são variáveis de shell.Para o PowerShell, seria assim:
$global:MyComponent_MySetting = '12'
# i.e.
$PSDefaultParameterValues
$ErrorActionPreference
Se se espera que as configurações sejam herdadas através dos limites dos processos, a convenção é usar variáveis de ambiente.Estendo isso para configurações que ultrapassam os limites do C#/PowerShell.Alguns exemplos:
$env:PATH
$env:PSModulePath
Se você acha que este é um antipadrão para .NET, você pode querer reconsiderar.Essa é a norma para aplicativos hospedados em PAAS e será o novo padrão para ASP.NET em execução em CLR otimizado para servidor (ASP.NET v5).
Ver https://github.com/JabbR/JabbRv2/blob/dev/src/JabbR/Startup.cs#L21
Observação:no momento em que escrevo estou linkando para .AddEnvironmentVariables()
Revisitei essa questão algumas vezes, inclusive me perguntando.Eu queria apostar no terreno para dizer que as coisas do PowerShell não funcionam bem com <appSettings>
.Na IMO, é muito melhor adotar o aspecto shell do PS do que o aspecto .NET nesse aspecto.
Se você precisar de uma configuração complexa, use uma string JSON.POSH v3 + tem ConverterFrom-JSON construídas em.Se tudo em seu processo usar a mesma configuração complexa, coloque-o em um arquivo .json e aponte para esse arquivo a partir de uma variável de ambiente.
Se um único arquivo não for suficiente, existem soluções bem estabelecidas como o PATH
padrão, GIT.gitignore resolução, ou ASP.NET web.config resolução (que não vou repetir aqui).