Я пытаюсь изменить файл web.config с помощью PowerShell.
Пока я могу заменить строку подключения, используя:
Set-WebConfigurationProperty -pspath "IIS:\Sites\$Name\WS" -filter "connectionStrings/add[@name='Product.Core.WebServices.Properties.Settings.DirectoryConnectionString']" -name "connectionString" -value "Server=SERVERNAME\INSTANCE1;Database=ProductDirectory.$Name;Trusted_Connection=True;"
это работает нормально.
Теперь я хочу что-то изменить в части applicationSettings файла web.config. Деталь выглядит так:
<applicationSettings>
<Product.Core.WebServices.Properties.Settings>
<setting name="LogLevel" serializeAs="String">
<value>Info</value>
</setting>
<setting name="LogDirectory" serializeAs="String">
<value>D:\temp</value>
</setting>
<setting name="LogSpecialTroubleshoot" serializeAs="String">
<value>False</value>
</setting>
<setting name="LogSqlQueries" serializeAs="String">
<value>False</value>
</setting>
<setting name="LogPerformance" serializeAs="String">
<value>False</value>
</setting>
<setting name="LogXmlInput" serializeAs="String">
<value>False</value>
</setting>
<setting name="LogXmlInputSeperate" serializeAs="String">
<value>False</value>
</setting>
<setting name="EnableCatchAllLogging" serializeAs="String">
<value>True</value>
</setting>
<setting name="DirectoryDatabaseName" serializeAs="String">
<value>ProductDirectory</value>
</setting>
</Product.Core.WebServices.Properties.Settings>
</applicationSettings>
Я хочу изменить узел "DirectoryDatabaseName".
С помощью:
Set-WebConfigurationProperty -pspath "IIS:\Sites\$Name\WS" -filter "applicationSettings" -name "test" -value "ProductDirectory.$Name"
Я могу изменить "корневой" узел (applicationSettings) и добавить к нему атрибут с именем "test". Однако, если я пытаюсь углубиться в структуру, я получаю следующую ошибку:
WARNING: Target configuration object 'applicationSettings/Product.Core.WebServices.Properties.Settings/setting[@name='DirectoryDatabaseName'] is not found a
t path 'MACHINE/WEBROOT/APPHOST/TestM/WS'.
Для этого я использую следующий PS:
Set-WebConfigurationProperty -pspath "IIS:\Sites\$Name\WS" -filter "applicationSettings/Product.Core.WebServices.Properties.Settings/setting[@name='DirectoryDatabaseName']" -name "test" -value "ProductDirectory.$Name"
Даже это не работает (та же ошибка):
Set-WebConfigurationProperty -pspath "IIS:\Sites\$Name\WS" -filter "applicationSettings/Product.Core.WebServices.Properties.Settings" -name "test" -value "ProductDirectory.$Name"
Так что как-то перестает работать "на уровень ниже" applicationSettings
Кроме того, как должен быть синтаксис для изменения текста между <value>
и </value>
?
При редактировании файла web.config в виртуальном каталоге веб-сайта по умолчанию и попытке просмотреть и изменить раздел appSettings у меня сработало следующее:
#List all appSettings
Get-WebConfigurationProperty -pspath "iis:\Sites\Default Web Site\VirtualDir" -filter "/appSettings/add" -name *
#Update specific appSetting
Set-WebConfigurationProperty -pspath "iis:\Sites\Default Web Site\VirtualDir" -filter "/appSettings/add[@key='SomeKey']" -name value -Value "SomeValue"
Это предполагает стандартный раздел appSettings web.config, например:
<configuration>
...
<appSettings>
...
<add key="TestKey" value="TestValue"></add>
...
</appSettings>
...
</configuration>
В вашем случае значение сохраняется как текстовый узел вместо атрибута, поэтому полный xpath будет /applicationSettings/Product.Core.WebServices.Properties.Settings/setting[@name='DirectoryDatabaseName']/value/text()
однако я не могу найти ни одного примера файлов web.config со значениями, хранящимися в виде текстовых узлов. Примеры для Командлеты IIS также не показывать никаких ссылок на text ().
Возможно, вам придется установить фильтр для получения элемента настроек, а затем установить его на элемент значения с правильным текстом. Опять же, в примерах не показано, как это сделать, но они показывают, как использовать хеш-таблицу для установки нескольких значений, поэтому вы можете найти способ заставить ее работать.