web-dev-qa-db-ja.com

PowerShellを使用してIIS web.configを変更します

PowerShellを使用してweb.configを変更しようとしています。

これまでのところ、次を使用して接続文字列を置き換えることができます。

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;"

これは問題なく動作します。

ここで、web.configのapplicationSettings部分で何かを変更したいと思います。パーツは次のようになります。

<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"

したがって、どういうわけか「1つ下のレベル」で機能しなくなりますapplicationSettings

また、<value></value>の間でテキストを変更する構文はどのようになりますか?

5
MichelZ

デフォルトのWebサイトの仮想ディレクトリにある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"
_

これは、次のような標準のweb.config appSettingsセクションを想定しています。

_<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()への参照は表示されません。

フィルターを設定して設定要素を取得し、それを正しいテキストを含む値要素に設定する必要がある場合があります。繰り返しになりますが、例ではこれを行う方法は示していませんが、ハッシュテーブルを使用して複数の値を設定する方法を示しているため、これを機能させる方法を見つけることができます。

4
Greg Bray