PowerShell App.Config
-
09-06-2019 - |
Вопрос
Кто-нибудь придумал, как заставить PowerShell использовать app.config
файлы?У меня есть пара .NET DLL, которые я хотел бы использовать в одном из своих скриптов, но они ожидают, что их собственные разделы конфигурации будут присутствовать в app.config
/web.config
.
Решение
Перекрестные ссылки на эту тему, которые помогли мне с тем же вопросом:Дозвуковой доступ к строкам подключения App.Config из указанной библиотеки DLL в скрипте Powershell
Я добавил следующее в свой скрипт перед вызовом библиотеки DLL, для которой требуются настройки конфигурации, где $configpath - это местоположение файла, который я хочу загрузить:
[appdomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $configpath)
Add-Type -AssemblyName System.Configuration
Видишь это опубликуйте, чтобы убедиться, что указанный файл конфигурации применен к текущему контексту.
Другие советы
Я предполагаю, что настройки должны быть в powershell.exe.config в каталоге powershell, но это, похоже, плохой способ делать что-то.
Вы можете использовать ConfigurationManager.OpenMappedExeConfiguration для открытия файла конфигурации на основе имени исполняемой библиотеки DLL, а не exe-файла приложения, но это, очевидно, потребует внесения изменений в библиотеки DLL.
Пытаюсь найти новый ответ на старый вопрос.
Я думаю, что современный ответ был бы таким:не делай этого.PowerShell - это оболочка.Обычным способом передачи информации между частями оболочки являются переменные оболочки.Для powershell это выглядело бы следующим образом:
$global:MyComponent_MySetting = '12'
# i.e.
$PSDefaultParameterValues
$ErrorActionPreference
Если ожидается, что настройки будут наследоваться через границы процессов, то принято использовать переменные среды.Я распространяю это на параметры, которые пересекают границу C # / PowerShell.Приведу пару примеров:
$env:PATH
$env:PSModulePath
Если вы считаете, что это анти-шаблон для .NET, возможно, вы захотите пересмотреть.Это норма для приложений, размещенных на PAAS, и будет новым значением по умолчанию для ASP.NET запуска в среде CLR, оптимизированной для сервера (ASP.NET v5).
Видишь https://github.com/JabbR/JabbRv2/blob/dev/src/JabbR/Startup.cs#L21
Примечание:на момент написания статьи я даю ссылку на .AddEnvironmentVariables()
Я несколько раз возвращался к этому вопросу, в том числе задавал его себе.Я хотел вбить кол в землю, чтобы сказать, что материал PowerShell плохо работает с <appSettings>
.ИМО, в этом отношении гораздо лучше использовать аспект оболочки PS вместо аспекта .NET.
Если вам нужна сложная конфигурация, возьмите строку JSON.ШИКАРНЫЙ v3+ имеет Конвертировать из-JSON встроенный.Если все в вашем процессе использует одну и ту же сложную конфигурацию, поместите ее в файл .json и укажите на этот файл из переменной окружения.
Если одного файла недостаточно, существуют хорошо зарекомендовавшие себя решения, такие как PATH
узор, Мерзавец .gitignore разрешение, или ASP.NET web.config резолюция (которую я не буду здесь повторять).