0

PowerShellで値の置換を行おうとしています。一般的なクエリを含むテキストファイルがあります。

-- query.sql
SELECT
     'varTableName' AS myTableName
    , COUNT(DISTINCT parmColumnName) AS myDistinctCount
    , SUM(parmColumnName2) AS mySum
FROM varDatabaseName.varSchemaName.varTableName WITH (NOLOCK);

「var」と「parm」の値を置き換えようとしています。2つの異なるデータ行があります。私のスクリプトでは、最初のデータ行を反復処理し、フォーカスのある行を使用して置換を行います。これはうまくいきます。私の質問は次の部分です。次に、複数の行を含む2番目のデータ行を反復処理し、一致する値に対して置換を実行する必要があります。

私は失敗しましたが、次のようなことをしようとしました。

# myScript.ps1 -- does not work 
# ...
# Code here to populate $MyDataRow 
ForEach ($MyRow In $MyDataRow) {
    [string]$Query = Get-Content query.sql  | ForEach-Object {
                            $_ -replace "varTableName", $Table `
                               -replace "varDatabaseName", $MyRow.DatabaseName `
                               -replace "varSchemaName", $MyRow.SchemaName `
                               -replace "varTableName", $MyRow.TableName
                               -replace $MyOtherDataRow.SearchString, $MyOtherDataRow.ReplaceString
                            }
}

ただし、これは機能しました。

# myScript.ps1 -- works
# ...
# Code here to populate $MyDataRow 
ForEach ($MyRow In $MyDataRow) {
    [string]$Query = Get-Content query.sql  | ForEach-Object {
                            $_ -replace "varTableName", $Table `
                               -replace "varDatabaseName", $MyRow.DatabaseName `
                               -replace "varSchemaName", $MyRow.SchemaName `
                               -replace "varTableName", $MyRow.TableName
                            }

    ForEach($MyOtherRow In $MyOtherDataRow) {
        $Query = $Query | ForEach-Object {
            $_ -replace $MyOtherRow.SearchString, $MyOtherRow.ReplaceString
            }
    }
}

ただし、PowerShellを学習しているだけなので、これがこれを処理する最も効率的な方法であるかどうかはわかりません。どういうわけか、この2番目のForEach置換を最初の結果にパイプできるかどうか疑問に思っていますか?最善のアプローチは何ですか?

ああ、それに関連する場合は、PowerShell3.0を使用しています。

どんな入力でも大歓迎です。:)

4

1 に答える 1

1

私はおそらくこのようにします:

$query = Get-Content query.sql

$MyDataRow | % {
  $query = $query -replace "varDatabaseName", $_.DatabaseName `
                  -replace "varSchemaName", $_.SchemaName `
                  -replace "varTableName", $_.TableName
}

$MyOtherDataRow | % {
  $query = $query -replace $_.SearchString, $_.ReplaceString
}
于 2013-03-08T22:13:28.607 に答える