PowerShell应用程序配置文件

27

有人已经解决了如何让PowerShell使用app.config文件吗?我有几个.NET DLL文件,想在我的脚本中使用,但它们期望在app.config/web.config中存在自己的配置部分。

3个回答

39

3
哇...这么多年后还有回复 :). 谢谢,我会尝试一下。 - Kev
1
+1 非常感谢!在整个网络上,唯一提到解决此问题的方法是 ConfigurationManager.OpenMappedExeConfiguration,而没有针对我们无法控制所引用程序集的情况的解决方案!这对我的情况非常完美。 - fozylet
3
这段代码没有起作用,最终我使用了Robert Mooney的解决方案:https://dev59.com/dGQo5IYBdhLWcg3wOtQC - Tahir Hassan
那么,有人知道是否可以在dll内部设置它吗?我在设置时遇到了麻烦...似乎范围不对或者我不知道如何在我的C# dll模块内编写Set-AppConfigFile。/grr - Omzig

6
我猜想设置应该在powershell目录下的powershell.exe.config文件中,但这似乎不是一个好的做法。
你可以使用ConfigurationManager.OpenMappedExeConfiguration来打开一个基于执行DLL名称而非应用程序exe的配置文件,但这显然需要对DLL进行更改。

我强烈建议不要使用这样的解决方案。将其包装在一个控制台应用程序中,该应用程序将数据写入STDOUT作为JSON,或者ASP.NET WebAPI应用程序中。控制台与API之间的选择取决于托管和安全性。 - yzorg
另一个不使用它的原因是:PowerShell会随着操作系统更新,而powershell.exe.config是受保护的操作系统文件,这意味着它不能仅用记事本进行编辑。 - yzorg

2
尝试对一个旧问题给出新的答案。
我认为现代的答案是:不要这样做。PowerShell 是一个 shell。在 shell 的各个部分之间传递信息的正常方式是使用 shell 变量。对于 PowerShell,它看起来像这样:
$global:MyComponent_MySetting = '12'
# i.e. 
$PSDefaultParameterValues
$ErrorActionPreference

如果期望在进程边界继承设置,则惯例是使用环境变量。我将此扩展到跨越C# / PowerShell边界的设置。以下是一些例子:
$env:PATH
$env:PSModulePath

如果你认为这是.NET反模式,你可能需要重新考虑。这是PAAS托管应用程序的常态,并且将成为运行在经过优化的服务器CLR上的ASP.NET(ASP.NET v5)的新默认设置。
请参见https://github.com/JabbR/JabbRv2/blob/dev/src/JabbR/Startup.cs#L21。 注意:在撰写本文时,我正在链接到.AddEnvironmentVariables() 我已经多次重新审视了这个问题,包括自己提出这个问题。我想要确定PowerShell的东西与<appSettings>不兼容。在我看来,更好的方法是在这方面采用PowerShell方面而不是.NET方面。
如果您需要复杂的配置,请使用JSON字符串。 POSH v3+内置了ConvertFrom-JSON。 如果您的整个进程都使用相同的复杂配置,请将其放入.json文件中,并从环境变量指向该文件。
如果单个文件不够,那么就有一些行之有效的解决方案,比如 PATH 模式、GIT .gitignore 解决方案或ASP.NET web.config 解决方案(这里就不再赘述)。

2
“别这样做。”- 当然,非常感谢您花费的时间来回答我的问题。但是环境变量等并不能与这些旧版程序集一起使用,它们期望能够从“AppSettings”集合中读取其配置。 - Kev
@Kev 那些程序集确实不应在 PowerShell 上下文中使用。您可能需要自己托管 PowerShell。请参见“嵌入 PowerShell”,例如 Visual Studio 的“包管理器控制台”。 - yzorg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接