Назад | Перейти на главную страницу

Измените IIS web.config с помощью PowerShell

Я пытаюсь изменить файл 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 ().

Возможно, вам придется установить фильтр для получения элемента настроек, а затем установить его на элемент значения с правильным текстом. Опять же, в примерах не показано, как это сделать, но они показывают, как использовать хеш-таблицу для установки нескольких значений, поэтому вы можете найти способ заставить ее работать.