1

次のプロパティを含む.propertiesファイルがあります。

repository.host=hostname.com/nexus
repository.api.url=https://${repository.host}/service/rest/v1
repository.url=https://${repository.host}/repository

次のpowershell関数を使用して値を返すことができます:

    static [string] getProperty( [string] $property ){

        $properties = "../resources/vars/$([jenkins]::PROPERTIES_FILE)"
        $properties = get-content $properties | convertfrom-stringdata

        return $properties.$property

    }

プロパティrepository.urlを返そうとすると、powershell は次の文字列を返します。https://${repository.host}/repository/

私の質問は次のとおりです。返された文字列がPowerShellに既に存在する機能を介して可能https://hostname.com/nexus/repository/ですか?

4

2 に答える 2

0

@mklement0 によって提供された元のソリューションは非常に役に立ち、より完全なソリューションへと私を導いてくれました。このソリューションは、いくつかのことを達成/修正します。

  • ファイル ソースからハッシュ テーブルを作成する機能。
  • スコープ$ExecutionContextを使用して、クラス メソッド内から変数にアクセスする機能。$global:
  • ハッシュテーブル内のすべてのキーを完全に解析する機能。
    static [string] getProperties ( [string] $file, [string] $property ){

        $properties = get-content $file -raw | convertfrom-stringdata

        while ( $properties.values -match '\$\{([^}]+)\}' ){
            foreach ($key in @($properties.Keys)) {
                $properties[$key] = $global:ExecutionContext.InvokeCommand.ExpandString( ($properties[$key] -replace '\$\{([^}]+)\}', '$$($$properties[''$1''])') )
            }
        }

        return $properties[$property]
    }

注: while ループが存在せず、 の一致を検索すると${*}、返された値が完全に補間または展開されない場合があります。while ループが存在しない例として、ファイルからの出力は次のようになります。

/nexus
${nexus.protocol}://${nexus.hostname}:${nexus.port}${nexus.context}
${nexus.protocol}://${nexus.hostname}:${nexus.port}${nexus.context}/repository/installers/com/amazon/java/8.0.252/java-1.8.0-amazon-corretto-devel-1.8.0_252.b09-1.x86_64.rpm
${nexus.protocol}://${nexus.hostname}:${nexus.port}${nexus.context}
${nexus.protocol}://${nexus.hostname}:${nexus.port}${nexus.context}/repository/installers/com/oracle/tuxedo/12.1.3.0.0/p30596495_121300_Linux-x86-64.zip
443
https://hostname.com:443/nexus
https://hostname.com:443/nexus/repository/installers/com/oracle/java/jdk/8u251/jdk-8u251-linux-x64.rpm
https://hostname.com:443/nexus/repository/installers/com/oracle/weblogic/12.2.1.3.0/p30965714_122130_Generic.zip
hostname.com
https
https://hostname.com:443/nexus/repository/installers/com/oracle/weblogic/12.2.1.3.0/p30965714_122130_Generic.zip

そして、同じスクリプトを (まだ while ループなしで) もう一度実行すると、次のようになります。

hostname.com
https://hostname.com:443/nexus
/nexus
https://hostname.com:443/nexus
https://hostname.com:443/nexus
https://hostname.com:443/nexus/repository/installers/com/oracle/weblogic/12.2.1.3.0/p30965714_122130_Generic.zip
https://${nexus.hostname}:443/nexus/repository/installers/com/oracle/java/jdk/8u251/jdk-8u251-linux-x64.rpm
https://hostname.com:443/nexus/repository/installers/com/oracle/tuxedo/12.1.3.0.0/p30596495_121300_Linux-x86-64.zip
https://hostname.com:443/nexus/repository/installers/com/amazon/java/8.0.252/java-1.8.0-amazon-corretto-devel-1.8.0_252.b09-1.x86_64.rpm
443
https
https://${nexus.hostname}:443/nexus/repository/installers/com/oracle/weblogic/12.2.1.3.0/p30965714_122130_Generic.zip

時々不完全に補間/拡張された文字列の理由は、ハッシュテーブルが自然に順序付けられていないためです。while ループの導入により、すべての補間/拡張文字列が解決されるまで結果は返されません。

公式の出力は次のようになります。

hostname.com
https://hostname.com:443/nexus
/nexus
https://hostname.com:443/nexus
https://hostname.com:443/nexus
https://hostname.com:443/nexus/repository/installers/com/oracle/weblogic/12.2.1.3.0/p30965714_122130_Generic.zip
https://hostname.com:443/nexus/repository/installers/com/oracle/java/jdk/8u251/jdk-8u251-linux-x64.rpm
https://hostname.com:443/nexus/repository/installers/com/oracle/tuxedo/12.1.3.0.0/p30596495_121300_Linux-x86-64.zip
https://hostname.com:443/nexus/repository/installers/com/amazon/java/8.0.252/java-1.8.0-amazon-corretto-devel-1.8.0_252.b09-1.x86_64.rpm
443
https
https://hostname.com:443/nexus/repository/installers/com/oracle/weblogic/12.2.1.3.0/p30965714_122130_Generic.zip
于 2020-08-04T17:08:09.323 に答える